算法-八皇后问题

个人博客原文链接

问题简述:八皇后问题是一个以国际象棋为背景的问题:如何能够在8×8的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n1×n1,而皇后个数也变成n2。而且仅当n2=1或n1≥4时问题有解。

解决方案一:递归
思路分析:
定义num来控制皇后的个数,初始设置为8
定义count来计数,计算问题的解决方案总数
定义数组array[num]来存储每一组方案的结果
定义查找方法find(int n),参数n代表当前放的是第几个皇后,n从0开始
在find中调用输出方法print(),每查找到一组结果就打印输出
在find中调用判断方法judge(int n),判断第n个皇后的当前列和对角线上是否有其它皇后
如果没有,在find中递归查找下一个皇后的位置,查找结束就开始循环查找下一组
最后在main方法中调用find方法即可

代码实现:

/**
 * 八皇后——>n皇后
 * 描述:在8X8棋盘放8个皇后,任何一个皇后都无法直接吃掉其他的皇后,问一共有多少种方法
 * 时间:2018-7-21 16:47:11
 * @author LousenJay
 *
 */

public class Queen {
    private int num = 8;    //设置皇后的个数
    public static int count = 0; //计数
    private int[] array = new int[num]; //保存结果,第一个皇后在array[0],第二个在array[1]

    /**
     * 打印结果
     */
    private void print(int n){
        //打印一组结果
        System.out.println("第"+n+"组:");
        for (int i = 0; i < num; i++) {
            System.out.print(array[i]+1+" ");
        }   
        System.out.println();//换行
        System.out.println("棋盘展示:");
        for (int i = 0; i < num; i++) { //打印行
            for (int j = 0; j < num; j++) { //打印列
                if(j == array[i]){
                    System.out.print("♛");
                }else{
                    System.out.print("☒");
                }
            }
            System.out.println();
        }
        System.out.println();
    }

    /**
     * 判断第n行的皇后在当前列和对角线上是否有皇后
     * 如果有则返回false,循环下一个列继续匹配
     * 如果该列符合则返回true,开始下一行查找
     * @param n
     * @return
     */
    private boolean judge(int n){
        for (int i = 0; i < n; i++) {
            //判断第n行的皇后在当前列和对角线上是否有皇后
            if(array[i] == array[n] || Math.abs(n - i) == Math.abs(array[n] - array[i])){
                return false;
            }
        }
        return true;
    }

    /**
     * n代表当前放的是第几个皇后
     * array[n]代表第n个皇后的列的位置
     * @param n
     */
    private void find(int n){
        /*如果皇后全部放完了,则计数并打印该种方法*/
        if(n == num){
            count++;//计数
            print(count);//输出
            return;
        }

        /*开始第一组查找,先从第一行的8个列开始查找,符合条件开始依次查找第二行,
         * 八行全部符合条件,查找结束,计数+1并打印结果
         * 不符合就开始查找第二组
         * 最后所有结果全部查找完毕,跳出递归循环*/
        for (int i = 0; i < num; i++) {
            array[n] = i; //遍历每一列放置的八种可能,列
            if(judge(n)){ //行
                find(n+1); //递归查找第二列
            }
        }

    }

    public static void main(String[] args) {
        Queen q = new Queen();
        q.find(0); //从第一行开始查找
        System.out.println("总计:"+q.count+"种方法");        
    }
}

猜你喜欢

转载自blog.csdn.net/a1135497143/article/details/81943201