目录
一、八皇后思路
八皇后的规则 :任意两个皇后之间不能在同一行 同一列 和不能在同一斜线
思路:
1.我们使用一个以为数组表示这个棋盘:例如0就是第一行第一个元素,2就是第二行第三个元素,5就是第三行第6个元素
2.创建规则参数接受 (在该行的第几个)判断 是否和之前的皇后 同一行 同一列 同一斜线 如果是就返回false
3.每添加一个皇后,就将这个皇后和之前添加的每个皇后进行规则的比较,如果满足规则就添加:
3.1第一个皇后先放第一行第一列
3.2第二个皇后放在第二行第一列、然后判断是否 OK, 如果不 OK,继续放在第二列、第三列、依次把所有列都 放完,找到一个合适
3.3 继续第三个皇后,还是第一列、第二列……直到第 8 个皇后也能放在一个不冲突的位置,算是找到了一个正确 解
3.4 当得到一个正确解时,在栈回退到上一个栈时,就会开始回溯,即将第一个皇后,放到第一列的所有正确解, 全部得到.
5) 然后回头继续第一个皇后放第二列,后面继续循环执行 1,2,3,4
二、代码
public class Queue8 {
static int max=8;
int count=0;
static int [] arr=new int[max];
public static void main(String[] args) {
Queue8 z = new Queue8();
z.check(0);
System.out.println(z.count);
}
private void check(int n){
if (n==max){//n==8 表示 已经按照规则放好
print();//输出可以的排序
count++;
return;
}
for (int i = 0; i <max ; i++) {
arr[n]=i; //设置n为第i行
if (Rules(n)){//如果判断规则合法
check(n+1);//递归下一行
}
}
//for循环判断该行8次后发现都不符合规则
//退出这个方法 就回溯到之前n进来的位置
}
//n 表示第n行皇后
private boolean Rules(int n){
for (int i = 0; i < n; i++) {
//arr[n]==arr[i] 表示判断第n个皇后和第i个皇后是否在同一列
//Math.abs(n-i)==Math.abs(arr[n]-arr[i]) 表示判断 是否在同一条斜线上
//判断同一行没有必要写 因为n在递增
if (arr[n]==arr[i]||Math.abs(n-i)==Math.abs(arr[n]-arr[i])){
return false;
}
}
return true;
}
//输出可以成功的方法
private void print(){
for (int i = 0; i < max; i++) {
System.out.print(arr[i]+" ");
}
System.out.println();
}
}
三.回溯思路
1.看图已知1-5列已经不能添加皇后(同列)
Math.abs(n-i)==Math.abs(arr[n]-arr[i]) {[0, 2, 4, 1, 3, 5, 0, 0]}
2.我们试着在第6列添加元素发现他和第一行第一列同斜线
abs(5-0)==abs(arr[5]-arr[0]) 结果为false
Math.abs(n-i)==Math.abs(arr[n]-arr[i]) {[0, 2, 4, 1, 3, 7, 0, 0]}
3.在第8列添加元素发现他和第三行第五列同斜线
abs(7-4)==abs(arr[5]-arr[4]) 结果为false
4.这个时候就要回溯回到第五行 看看五行有没有别的存放点如果有,将第五行的皇后点换到其他位置,再去查看第六行可不可以存放皇后,如果不能就继续回溯,第五行找不出其他位置就回溯到第四行