9.9---n皇后问题(CC150)

时间:2022-08-17 04:02:17

思路:首先写一个检查能不能摆的函数。boolean checkValid(int[] columns,int row1, int column1);意思是row1行摆在column1列可不可以。

然后是place函数。第一个参数row表示现在摆第几行。第一行可以摆n次位置,然后往下也是8ci。也就是相当于8^8次检查。如果能摆了,往下一行,如果不能摆往后移一列。当row>8说明摆好了。那么计数器+1.

答案:

public class Solution{

    public static void main(String[] args){

        System.out.println(nQueens(8));
}
public static int nQueens(int n) {
// write code here
int[] columns = new int[n];
int[] a = new int[1];
placeQueens(n,0,columns,a);
return a[0];
}
public static void placeQueens(int n,int row, int[] columns,int[] a){
if(row == n){
a[0]++;
}else{
for(int col = 0; col < n; col++ ){
if(checkValid(columns,row,col)){
columns[row] = col;//放皇后
placeQueens(n,row + 1,columns,a);
}
}
}
} public static boolean checkValid(int[] columns, int row1, int column1) {
for (int row2 = 0; row2 < row1; row2++) {
int column2 = columns[row2];
if (column1 == column2) {
return false;
}
int columnDistance = Math.abs(column2 - column1);
int rowDistance = row1 - row2; // row1 > row2, so no need to use absolute value
if (columnDistance == rowDistance) {
return false;
}
}
return true;
}
}