您的位置:首页 > 编程语言 > Java开发

八皇后问题 java

2017-08-03 15:35 197 查看

一、什么是八皇后问题

有一块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种解法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: