public class eigthQueen {
public static int count = 0;
public static void main(String[] args) {
int[][] matrix = new int[9][9];
Queen(0, matrix); // 调用递归的函数是从该数组的0第一个元素开始的
}
public static void Queen(int row, int[][] arr) {
if (row == arr.length) {// 如果已经到了该数组的最后一行,说明一种情况就找完了
count++; // 记录这是第几种情况,所以用到上面全部变量,因为后面要调用自身函数,
// 如果在函数一开始定义一个count,那么他的值永远都是0和1,定义在主函数这里是访问不到的,所以用到全局变量
System.out.println("这是第" + count + "种情况:"); // 打印出现的第几种情况
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j]);
}
System.out.println();
}
} else {
int[][] newArr = new int[arr.length][arr[0].length];
for (int i = 0; i < newArr.length; i++) {
for (int j = 0; j < newArr[0].length; j++) {
newArr[i][j] = arr[i][j];
}
}
for (int i = 0; i < newArr.length; i++) {
if (noDengours(row, i, newArr)) {
for (int c = 0; c < newArr[0].length; c++) {
newArr[row][c] = 0;
}
newArr[row][i] = 1;
Queen(row + 1, newArr);
}
}
}
}
public static boolean noDengours(int row, int col, int[][] arr) {
for (int i = row - 1; i >= 0; i--) {
if (arr[i][col] == 1) {
return false;
}
}
// 在判断右上的位置是否有1
for (int i = row - 1, j = col + 1; i >= 0 && j < arr[0].length; i--, j++) {
if (arr[i][j] == 1) {
return false;
}
}
// 最后判断左上的位置是否有一
for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) {
if (arr[i][j] == 1) {
return false;
}
}
return true;
}
}