八皇后问题 java

来源:互联网 发布:js contents 编辑:程序博客网 时间:2024/06/08 13:12

一、什么是八皇后问题

有一块8乘8的棋盘(64个格子),还有8个皇后需要放在在64个格子上,有多少种放置方法可以使得皇后不在同一行、不在同一列,不再同一斜线。
这里写图片描述

二、代码(参考自 https://my.oschina.net/js99st/blog/417837 感谢作者辛苦注释)

package com.yuzhiyun;public class NQueen2 {    public static void main(String[] args) {        // 摆放皇后的方案数量        int result = 0;        // 8个皇后,queen[i]=j表示第(i+1)行的皇后在第(j+1)列        int queen[] = new int[8];        // 初始化状态,-1表示该皇后没有指定在第几列        for (int i = 0; i < queen.length; i++) {            queen[i] = -1;        }        // 表示当前处理皇后在第几行        int line = 0;        while (true) {            // 当前皇后右移一位            queen[line]++;            // 如果超出范围,无法再右移了            if (queen[line] >= queen.length) {                // 结束,已经遍历完所有情况了                if (line == 0)                    break;                else {                    // 重置该行皇后的位置                    queen[line] = -1;                    // 回溯到上一行,以便让上一行的皇后继续右移                    line--;                    // 跳出循环                    continue;                }            } else if (!willBeEaten(line, queen)) {                // 如果当前行的皇后这样摆放没问题,那么开始处理下一行皇后的位置                line++;                // 如果行数超出范围了,表示成功找到了一种方案使得皇后之间不冲突                if (line >= queen.length) {                    // 再次处理最后一行的皇后,因为很可能,该皇后继续右移,也能产生新的方案                    line--;                    for (int i = 0; i < queen.length; i++) {                        System.out.print(queen[i] + " ");                        // 记录方案总数量                    }                    System.out.println();                    result++;                }            }        }        System.out.println(result+"");    }    /**     * 判断放置第k个皇后之后是否与之前的皇后冲突,判定冲突的条件是,第k个皇后的于前面的第i个皇后在横轴坐标相等,     * 或者横坐标和纵坐标之差相等(两者连线于横轴夹角为45度)如果冲突返回true,否则返回false     *      * @param k     *            第k个皇后     * @return 放置地k个皇后之后是否与之前的皇后冲突     */    public static boolean willBeEaten(int k, int[] queen) {        for (int i = k - 1; i > -1; i--) {// i的起点为k-1,即k个皇后的上一行            if (queen[k] == queen[i] || Math.abs(queen[k] - queen[i]) == Math.abs(k - i)) {                return true;            }        }        return false;    }}

三、运行结果

0 4 7 5 2 6 1 3 0 5 7 2 6 3 1 4 0 6 3 5 7 1 4 2 0 6 4 7 1 3 5 2 1 3 5 7 2 0 6 4 1 4 6 0 2 7 5 3 1 4 6 3 0 7 5 2 1 5 0 6 3 7 2 4 1 5 7 2 0 3 6 4 1 6 2 5 7 4 0 3 1 6 4 7 0 3 5 2 1 7 5 0 2 4 6 3 2 0 6 4 7 1 3 5 2 4 1 7 0 6 3 5 2 4 1 7 5 3 6 0 2 4 6 0 3 1 7 5 2 4 7 3 0 6 1 5 2 5 1 4 7 0 6 3 2 5 1 6 0 3 7 4 2 5 1 6 4 0 7 3 2 5 3 0 7 4 6 1 2 5 3 1 7 4 6 0 2 5 7 0 3 6 4 1 2 5 7 0 4 6 1 3 2 5 7 1 3 0 6 4 2 6 1 7 4 0 3 5 2 6 1 7 5 3 0 4 2 7 3 6 0 5 1 4 3 0 4 7 1 6 2 5 3 0 4 7 5 2 6 1 3 1 4 7 5 0 2 6 3 1 6 2 5 7 0 4 3 1 6 2 5 7 4 0 3 1 6 4 0 7 5 2 3 1 7 4 6 0 2 5 3 1 7 5 0 2 4 6 3 5 0 4 1 7 2 6 3 5 7 1 6 0 2 4 3 5 7 2 0 6 4 1 3 6 0 7 4 1 5 2 3 6 2 7 1 4 0 5 3 6 4 1 5 0 2 7 3 6 4 2 0 5 7 1 3 7 0 2 5 1 6 4 3 7 0 4 6 1 5 2 3 7 4 2 0 6 1 5 4 0 3 5 7 1 6 2 4 0 7 3 1 6 2 5 4 0 7 5 2 6 1 3 4 1 3 5 7 2 0 6 4 1 3 6 2 7 5 0 4 1 5 0 6 3 7 2 4 1 7 0 3 6 2 5 4 2 0 5 7 1 3 6 4 2 0 6 1 7 5 3 4 2 7 3 6 0 5 1 4 6 0 2 7 5 3 1 4 6 0 3 1 7 5 2 4 6 1 3 7 0 2 5 4 6 1 5 2 0 3 7 4 6 1 5 2 0 7 3 4 6 3 0 2 7 5 1 4 7 3 0 2 5 1 6 4 7 3 0 6 1 5 2 5 0 4 1 7 2 6 3 5 1 6 0 2 4 7 3 5 1 6 0 3 7 4 2 5 2 0 6 4 7 1 3 5 2 0 7 3 1 6 4 5 2 0 7 4 1 3 6 5 2 4 6 0 3 1 7 5 2 4 7 0 3 1 6 5 2 6 1 3 7 0 4 5 2 6 1 7 4 0 3 5 2 6 3 0 7 1 4 5 3 0 4 7 1 6 2 5 3 1 7 4 6 0 2 5 3 6 0 2 4 1 7 5 3 6 0 7 1 4 2 5 7 1 3 0 6 4 2 6 0 2 7 5 3 1 4 6 1 3 0 7 4 2 5 6 1 5 2 0 3 7 4 6 2 0 5 7 4 1 3 6 2 7 1 4 0 5 3 6 3 1 4 7 0 2 5 6 3 1 7 5 0 2 4 6 4 2 0 5 7 1 3 7 1 3 0 6 4 2 5 7 1 4 2 0 6 3 5 7 2 0 5 1 4 6 3 7 3 0 2 5 1 6 4 一共有92种解法
原创粉丝点击