数据结构之8皇后问题

在看这篇博文之前,大家可以先玩玩8皇后游戏,在此附上游戏连接点此开始游戏之旅!

8皇后游戏规则是任意在8*8的棋盘上摆放8个皇后,并且这8个皇后之间不能相互攻击(即任意两个皇后不能在同一行,同一列,同一条斜线上)。问:总共有多少种摆放?总共进行了多少次冲突检查?

在玩游戏的时候明显感觉大脑不足,写个代码帮我找一些摆放方式吧!

实现是利用递归,一维数组实现。8*8棋盘本应该用一个二维数组存放,但是由于8皇后问题的特殊性,选择一个长度为8的一维数组也可达到此效果。用数组的下标表示第i+1个皇后,每个皇后放在单独的一行(第一个皇后在第一行,第二个在第二行.....),对应的值代表这个皇后放置在第j+1列。这样就可实现了,下面来看看代码。

public class Queue8 {static int count;//总共有几种排发static int judgeCount;//总共判断了多少次//总共有多少个皇后int max = 8;//用一个一维数组即可存储,数组下标表示第几个皇后,对应的值表示这个皇后放到了第几列int[] array = new int[max];public static void main(String[] args) {Queue8 queue8 = new Queue8();queue8.check(0);System.out.println("总共有"+count+"种方式");System.out.println("冲突判断了"+judgeCount+"次");}/*** 检查第几个皇后应该放在哪个位置,每一个皇后都从第一列开始放,冲突后到下一列* @param n*/private void check(int n){if (n == max){//n==max时已经是第9个皇后,前8个皇后已经放置好了print();return;}for (int i = 0; i < max; i++) {//每个皇后都先放到第一列array[n] = i;//判断是不是冲突if (judge(n)){//不冲突,继续下一个皇后check(n+1);}//冲突则放到下一列}}private boolean judge(int n) {judgeCount++;//判断第n个皇后与前几个皇后位置是否冲突,在同一行,同一列,同一条斜线上即为冲突for (int i = 0; i < n; i++) {if (array[i] == array[n] || Math.abs(i-n) == Math.abs(array[i]-array[n])){//冲突return false;}}return true;}private void print(){count++;for (int i = 0; i < max; i++) {System.out.print(array[i]+" ");}System.out.println();}
}

附上程序跑出的结果:

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种方式
冲突判断了15720次

用第一个结果完了一把游戏,结果如下图:

欢迎留言交流哦。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部