八皇后问题java
问题描述
-
初始化一个8*8的棋盘,总共有8个棋子,都是皇后。
-
在棋盘上摆放棋子,满足规则:
1.同一行只能有一个棋子;
2.同一列只能有一个棋子;
3.同一条斜线上只能有一个棋子。
解题思路
- 定义size=8(可灵活更改),int[] (size)。
- 数组的下标可代表棋子在第几行棋盘上,对应的数组的值代表在第几列。
- 例如array[0] = 0表示在第一行第一列有一个棋子。
- 回溯:当第n+1棋子放在哪一列都不符合,则回溯到上一个棋子,改变位置,通过后继续递归下一个棋子。
- 从而可以得出一共有多少种摆法。
public class Queen8 {
//初始化数组,定义一个8为的一维数组
int max = 9;
int[] array = new int[max];
static int count = 0;
static int judgeCount = 0;
public static void main(String[] args) {
new Queen8().check(0);
System.out.println(count);
System.out.println("一共判断了多少此次:"+judgeCount);
}
public void check(int n) {
if (n==max) {
print();
return;
}
for (int i = 0; i < max; i++) {
array[n] = i;
if (judge(n)) {
check(n+1);
}
}
}
/*
* 不能出现在同一行或者同一列,同一条斜线
* 判断第n个皇后
*/
public boolean judge(int n) {
judgeCount++;
for (int i = 0; i < n; i++) {
if(array[i]==array[n] || Math.abs(n-i)==Math.abs(array[n]-array[i])) {
return false;
}
}
return true;
}
public void print() {
count++;
for (int i = 0; i < array.length; i++) {
System.out.print(array[i]+" ");
}
System.out.println();
}
}
暂时学习到这里,感觉算法很暴力,后续改进。
来源:https://blog.csdn.net/qq_43018213/article/details/101264090