八皇后问题介绍:(共92中解法)
问题思路分析:
当我们放置第n个皇后时,就要查看当前皇后是否和之前的皇后冲突,要进行判断
需要着重理解的判断条件是:
private boolean judge(int n) {
for (int i = 0; i < n; i++) {
if (arr[n] == arr[i] || Math.abs(n - i) == Math.abs(arr[n] - arr[i])) {
return false;
}
}
return true;
}
代码实现
package demo;
//八皇后问题
public class Queen {
int max = 8;//皇后的数量
int[] arr = new int[max];//保存皇后的位置
static int count = 0;//共有多少种解法
static int judgecount = 0;//共进行多少次判断
public static void main(String[] args) {
Queen queen = new Queen();
queen.check(0);
System.out.printf("一共有%d中解法\n",count);
System.out.printf("一共遍历%d次",judgecount);
}
//打印皇后存放位置
private void print() {
count++;
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
private boolean judge(int n) {
judgecount++;
for (int i = 0; i < n; i++) {
if (arr[n] == arr[i] || Math.abs(n - i) == Math.abs(arr[n] - arr[i])) {
return false;
}
}
return true;
}
private void check(int n){
if(n == max){
print();
return;
}
for (int i = 0; i < max; i++) {
arr[n] = i;
if(judge(n)){
check(n+1);
}
}
}
}
从输出情况来看回溯法的效率并不是很高,需要进行判断多大一万多次,后面应该还会遇到更加高效的解决办法。