算法作业三

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <sys/time.h>
#include <windows.h>
#include <algorithm>
#include <cmath>
using namespace std;
#define INF 0x3f3f3f3f
#define LL long long
#define mem(a,b) memset(a,b,sizeof(a))
#define MAXN 100010

bool vis[3][20];

int mp[10][10];

void init()
{
    mem(vis,false);
    mem(mp,0);
}

bool check(int a,int b)
{
    if(!vis[0][a] && !vis[1][a-b+8] && !vis[2][a+b])
    {
        vis[0][a]=vis[1][a-b+8]=vis[2][a+b]=true;
        return true;
    }
    else return false;
}

void get()
{
    for(int i =0;i<8;i++)
    {
        int a,b;
        scanf("%d %d",&a,&b);
        mp[a][b] = 1;
        if(check(a,b)) printf("OK\n");
        else printf("WRONG\n");
    }
}

void show()
{
    for(int i =1;i<=8;i++)
    {
        for(int j = 1;j<=8;j++)
        {
            printf("%d\t",mp[i][j]);
        }
        printf("\n");
    }
}

int main()
{
    int i,j,k,T;
    scanf("%d",&T);
    while(T--)
    {
        init();
        get();
        show();
    }

    return 0;
}

/*
3
1 4 2 7 3 3 4 8 5 2 6 5 7 1 8 6
1 5 2 2 3 4 4 7 5 3 6 8 7 6 8 1
1 4 2 2 3 7 4 3 5 6 6 8 7 5 8 1
*/

 

 

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <time.h>
#include <windows.h>
#include <algorithm>
#include <cmath>
using namespace std;
#define INF 0x3f3f3f3f
#define LL long long
#define mem(a,b) memset(a,b,sizeof(a))
#define MAXN 100010

bool vis[5][20];

int mp[10][10],ans;

void init()
{
    mem(vis,false);
    mem(mp,0);
    ans=0;
}

bool check(int a,int b)
{
    if(!vis[3][a] && !vis[0][b] && !vis[1][b-a+8] && !vis[2][a+b])
    {
        vis[3][a]=vis[0][b]=vis[1][a-b+8]=vis[2][a+b]=true;
        return true;
    }
    return false;
}

void show()
{
    for(int i =1;i<=8;i++)
    {
        for(int j = 1;j<=8;j++)
        {
            printf("%d\t",mp[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}

void dfs(int x)
{
    if(x>8) 
    {
        show();
        ans++;
        return;
    }
    int i;
    for(i=1;i<=8;i++)
    {
        if(!vis[0][i] && !vis[1][x-i+8] && !vis[2][x+i])
        {
            vis[0][i]=vis[1][x-i+8]=vis[2][x+i]=true;
            mp[x][i] = 1;
            dfs(x+1);
            vis[0][i]=vis[1][x-i+8]=vis[2][x+i]=false;
            mp[x][i] = 0;
        }
    }
}

void get()
{
    for(int i =0;i<8;i++)
    {
        int a,b;
        scanf("%d %d",&a,&b);
        mp[a][b] = 1;
        show();
        if(check(a,b))
        {
            printf("OK\n");
        }
        else
        {
            printf("WRONG\n");
            break;
        }
    }
}


int main()
{
    int i,j,k,T;

    printf("输入1为测试,2为遍历\n");
    scanf("%d",&k);
    
    init();

    if(k==1)
    {
        printf("请输入棋子的坐标\n");
        get();
    }
    else
    {
        dfs(1);
        printf("总共有%d个解法\n",ans);
    }

    return 0;
}

/*
1 4 
2 7 
3 3 
4 8 
5 2 
6 5 
7 1 
8 6
*/
/*
1 5
2 2 
3 4 
4 7 
5 3 
6 8 
7 6 
8 1
*/
/*
1 4 
2 2 
3 7 
4 3 
5 6 
6 8 
7 5 
8 1
*/

 

 

package java_test;

import javax.swing.*;
import java.awt.*;

public class Queen 
{
    public static int num = 0;
    private show show = null;

    
    //vis[0]保存主对角线状态,vis[1]保存副对角线状态,vis[2]保存每列状态
    //因为是从上到下顺序执行,所以行状态不用保存,用pos保存位置即可
    public void Queen(int queenNum) 
    {
        int pos[] = new int[queenNum];
        boolean vis[][] = new boolean[5][20];
        for(int i =0;i<5;i++)
        {
            for(int j=0;j<20;j++) vis[i][j] = false;
        }
        dfs(0, queenNum, pos,vis);
    }

    private void dfs(int row, int queenNum, int pos[], boolean vis[][]) 
    {
        if (row == queenNum) //到了最后一行则打印
        {
            num++;
            printQueen(pos);
            return;
        }
        
        for (int col = 0; col < queenNum; col++) 
        {
            if (!vis[0][col] && !vis[1][row-col+8] && !vis[2][row+col])
            {
                pos[row] = col;
                vis[0][col]=vis[1][row-col+8]=vis[2][row+col]=true;
                if (show != null) show.showQueen(pos, row);
                dfs(row + 1, queenNum, pos,vis);
                vis[0][col]=vis[1][row-col+8]=vis[2][row+col]=false;
                pos[row] = col;
            }
        }
    }

    private boolean check(int a,int b,boolean vis[][])
    {
        if(!vis[0][a] && !vis[1][b-a+8] && !vis[2][b+a])
        {
            vis[0][a]=vis[1][b-a+8]=vis[2][b+a]=true;
            return true;
        }
        return false;
    }

    /**
     * 打印棋盘
     */
    private void printQueen(int[] status) {
        int n = status.length;
        StringBuilder queenString = new StringBuilder();
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                queenString.append((j == status[i]) ? '*' : '-');
                queenString.append((j == (n - 1)) ? "\n" : "   ");
            }
        }

        System.out.println("第" + num + "种解决方案:");
        System.out.println(queenString);
    }

    public void setshow(show show) {
        this.show = show;
    }

    public static void main(String[] args) {
        show shower = new show();
        shower.setDelay(10); // 设置动画暂停时间
        shower.setDelayOfEnd(30);

        // 设置显示窗口
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(500, 500);
        frame.setLocationRelativeTo(null);
        frame.getContentPane().add(shower);
        frame.setVisible(true);

        // 创建EightQueen
        Queen queen = new Queen();
        queen.setshow(shower);
        int queenNumber = 8;//皇后数量
        queen.Queen(queenNumber);
        System.out.println("总共有" + num + "种解决方案,呵呵,效果还不错吧O(∩_∩)O");
    }
}

/**
 * 用来显示皇后状态的Panel
 */
class show extends JPanel {
    private int   currentRow = 0; // 当前是第几行
    private int[] status     = null; // 皇后状态数组
    private int   delay      = 100; // 动画暂停时间
    private int   delayOfEnd = 5000; // 找到解决方暂停的时间,停久点可以方便看到解决方案

    public show() {
    }

    public int getDelay() {
        return delay;
    }

    public void setDelay(int delay) {
        this.delay = delay;
    }

    public int getDelayOfEnd() {
        return delayOfEnd;
    }

    public void setDelayOfEnd(int delayOfEnd) {
        this.delayOfEnd = delayOfEnd;
    }

    public void showQueen(int[] status, int currentRow) {
        this.status = status;
        this.currentRow = currentRow;
        this.repaint();

        try {
            // 找到解决方案的时候,多停一会
            Thread.sleep((currentRow == status.length - 1) ? delayOfEnd : delay);
        } catch (InterruptedException e) {
        }
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g); // 使用Swing自带的双缓冲清除上一帧的痕迹

        if (status == null) { return; }

        int x = 0, y = 0;
        int offsetX = 2, offsetY = 2; // gaps between the frame
        Dimension size = getSize();
        int cellWidth = (size.width - offsetX - offsetX) / status.length;
        int cellHeight = (size.height - offsetY - offsetY) / status.length;

        // Draw row grid lines
        int width = status.length * cellWidth;
        for (int i = 0; i <= status.length; ++i) {
            g.drawLine(0 + offsetX, y + offsetY, width + offsetX, y + offsetY);
            y += cellHeight;
        }

        // Draw column grid lines
        int height = status.length * cellHeight;
        for (int i = 0; i <= status.length; ++i) {
            g.drawLine(x + offsetX, offsetY, x + offsetX, height + offsetY);
            x += cellWidth;
        }

        // Draw queens
        for (int i = 0; i <= currentRow; ++i) {
            x = status[i] * cellWidth;
            y = i * cellHeight;

            g.fillRect(x + offsetX, y + offsetY, cellWidth, cellHeight);
        }
    }
}

 

posted @ 2016-10-31 14:42  qlky  阅读(188)  评论(0编辑  收藏  举报