挑战程序设计竞赛(算法和数据结构)——19.1八皇后问题的JAVA实现

Posted 小乖乖的臭坏坏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了挑战程序设计竞赛(算法和数据结构)——19.1八皇后问题的JAVA实现相关的知识,希望对你有一定的参考价值。

题目&思路:


对每一行的每一列进行放置皇后的操作,如果满足要求则放置皇后,更新限制数组,放置后对下一行进行放置皇后的操作,不断回溯。如果产生冲突,则对这一行的下一列进行操作,由于问题总是有解的,故总能搜索到答案。

代码:

import java.util.Scanner;

public class Puzzle 
    public static final int FREE = -1;
    public static final int NOT_FREE = 1;
    public static final int N = 8;

    public static void main(String[] args) 
        int row[] = new int[N];
        int col[] = new int[N];
        int dpos[] = new int[2*N-1];
        int dneg[] = new int[2*N-1];

        boolean X[][] = new boolean[N][N];

        //初始化
        for (int i=0;i<N;i++)
            row[i] = FREE;
            col[i] = FREE;
        
        for (int i=0;i<2*N-1;i++)
            dpos[i] = FREE;
            dneg[i] = FREE;
        
        for (int i=0;i<N;i++)
            for (int j=0;j<N;j++)
                X[i][j] = false;
            
        

        Scanner cin = new Scanner(System.in);
        int k = cin.nextInt();
        for (int i=0;i<k;i++)
            int r = cin.nextInt();
            int c = cin.nextInt();
            X[r][c] = true;
        

        recursive(0, row, col, dpos, dneg, X);
    

    public static void recursive(int i, int row[], int col[], int dpos[], int dneg[], boolean X[][])
        if(i==N)//成功放置皇后
            printBoard(X, row);return;
        

        for (int j=0;j<N;j++)
            //如果(i,j)受到其他皇后攻击,则忽略该格子
            if(NOT_FREE == col[j] ||
                NOT_FREE == dpos[i+j] ||
                NOT_FREE == dneg[i-j+N-1])continue;
            //在(i,j)放置皇后
            row[i] = j;
            col[j] = dpos[i+j] = dneg[i-j+N-1] = NOT_FREE;
            //尝试下一行
            recursive(i+1, row, col, dpos, dneg, X);
            //如果经过层层回溯还没有完成,那就说明冲突,说明这个位置的皇后放的不对,因此拿掉摆放在(i,j)的皇后
            col[j] = dpos[i+j] = dneg[i-j+N-1] = FREE;
        
        //皇后放置失败
    

    public static void printBoard(boolean X[][], int row[])
        for (int i=0;i<N;i++)
            for (int j=0;j<N;j++)
                if(X[i][j])
                    if(row[i]!=j)return;
                
            
        

        for (int i=0;i<N;i++)
            for (int j=0;j<N;j++)
                System.out.print(((row[i]==j)?"Q":"."));
            
            System.out.println();
        
    


输入:

2
2 2
5 3

输出:

......Q.
Q.......
..Q.....
.......Q
.....Q..
...Q....
.Q......
....Q...

以上是关于挑战程序设计竞赛(算法和数据结构)——19.1八皇后问题的JAVA实现的主要内容,如果未能解决你的问题,请参考以下文章

挑战程序设计竞赛(算法和数据结构)——分割(下)&快速排序的JAVA实现

挑战程序设计竞赛(算法和数据结构)——19.2九宫格拼图问题的JAVA实现

挑战程序设计竞赛(算法和数据结构)——7.1归并排序JAVA实现

挑战程序设计竞赛(算法和数据结构)——16.13线段相交问题(曼哈顿算法)的JAVA实现

挑战程序设计竞赛(算法和数据结构)——3.6希尔排序的JAVA实现

挑战程序设计竞赛(算法和数据结构)——3.6希尔排序的JAVA实现