八皇后问题 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种解法
阅读全文
0 0
- 八皇后问题 --java
- 【java】八皇后问题
- 八皇后问题 java
- 八皇后问题Java版
- 八皇后问题(java)
- 八皇后问题java代码
- 八皇后问题java实现
- 八皇后问题(JAVA)
- 八皇后问题 java代码
- Java解决八皇后问题
- 八皇后问题的java实现
- 八皇后问题的java 实现
- 八皇后问题的java实现
- 八皇后问题(java解决)
- 用Java解决八皇后问题
- Java实现经典八皇后的问题
- java实现八皇后的排列问题
- 算法编程(JAVA)--八皇后问题
- hdu-暑假集训-Questionnaire
- 基本布局
- 数据库链接
- php使用二维码类库生成图片二维码
- android studio so文件打包
- 八皇后问题 java
- 【Javascript】三个常用输出语句
- 自主车辆相关资源
- Java String、StringBuffer和StringBuilder类的区别
- 一个疑惑的问题:QObject::killTimer: Timers cannot be stopped from another thread
- python中的unicode
- 静态库和动态库
- 查询时候自己加个自增列
- 百练之小数的进制转换