八皇后问题
参考了他人的,自己动手写写
public class Test8Queen {
static int[][] area = new int[8][8];
static int count = 0;
public static void main(String[] args) {
findQueen(0);
System.out.println(count);
}
public static void findQueen(int row) {
if (row > 7) {
count++;
return;
}
//深度回溯,递归算法
for (int column = 0; column < 8; column++) {
if (check(row, column)) {
area[row][column] = 1;
findQueen(row + 1);
area[row][column] = 0;
}
}
}
//检查皇后摆放是否合适(简化只需要循环一次)
public static boolean check(int row, int column) {
//只需要检查当前行以上是否有冲突
int columnT;
for (int rowT = 0; rowT < row; rowT++) {
//检查行列
if (area[rowT][column] == 1) {
return false;
}
//检查左斜对角线
if ((columnT = column - (row - rowT)) >= 0 && area[rowT][columnT] == 1) {
return false;
}
//检查右斜对角线
if ((columnT = column + (row - rowT)) < 8 && area[rowT][columnT] == 1) {
return false;
}
}
return true;
}
//检查皇后摆放是否合适
public static boolean check2(int k,int j){//判断节点是否合适
for(int i=0;i<8;i++){//检查行列冲突
if(area[i][j]==1){
return false;
}
}
for(int i=k-1,m=j-1; i>=0 && m>=0; i--,m--){//检查左对角线
if(area[i][m]==1){
return false;
}
}
for(int i=k-1,m=j+1; i>=0 && m<=7; i--,m++){//检查右对角线
if(area[i][m]==1){
return false;
}
}
return true;
}
}
参考 [1]: https://www.jianshu.com/p/65c8c60b83b8