package test1;
/**
* 回溯思想,八皇后问题:任意两个皇后都不能处于同一行、同一列或同一斜线上
*/
public class BackTest {
//皇后数组
private int[] queen;
public void backMethod(int n){
//皇后数组初始化
queen = new int[n];
//初始化皇后起点
for(int i=0;i<queen.length;i++){
queen[i] = -1;
}
//从第一个皇后开始
int k = 0;
while (true){
//第K个皇后要移动一个位置
queen[k]+=1;
//判断是否应该回到上一行搜索
if(queen[k]>=n){
//皇后越界,此行没有位置可以放置皇后
if(k>0){
queen[k]=-1;
k--;
continue;
}else {
break;
}
}
if(!isMatch(k)){
k++;
if (k>=n){
for (int i=0;i<n;i++){
System.out.print(queen[i]+"");
}
System.out.println();
k--;
}
}
}
}
//判断我们第K个皇后是否与之前之后的皇后冲突
public boolean isMatch(int k){
for (int i=k-1;i>-1;i--){
if(queen[k]==queen[i] ||Math.abs(queen[k]-queen[i])==Math.abs(k-i)){
return true;
}
}
return false;
}
public static void main(String[] args) {
new BackTest().backMethod(8);
}
}