思路是:先解决白皇后问题,把白皇后在棋盘中放下以后,标记其位置,然后在放黑皇后。
注意 :在白皇后深度搜索之后记得回溯。
import java.util.Scanner;
import java.util.prefs.BackingStoreException;
public class Main {
public static int[][] a;//棋盘
public static int[] b;//存放白皇后的位置
public static int[] c;//存放黑黄后的位置
public static int n;
public static int sum = 0 ;
public static int count = 0 ;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
a = new int[n+1][n+1];
b = new int[n+1];//白皇后的位置
c = new int[n+1];//黑黄后的位置
for(int i = 1 ; i <= n ; i++ ){
for(int j = 1 ; j <= n ; j++ ){
a[i][j] = sc.nextInt();
}
}
BacktrackWhite(1);
System.out.println(sum);
//System.out.println(count);
}
public static boolean canPlaceWhite(int row,int col ){//不在同一列,不在同一个斜线上
for(int i = 1 ; i < row ; i++ ){//i -->行
if(b[i]==col||Math.abs((i-row))==Math.abs(col-b[i]))
return false;
}
return true;
}
public static boolean canPlaceBlack(int row , int col){
for(int i = 1 ; i < row ; i++ ){
if(c[i] == col||Math.abs(i-row) == Math.abs(c[i]-col)){//黑黄后同样不能放在同一列,同一斜线上
return false;
}
}
return true;
}
public static void BacktrackWhite(int row){
if(row > n ){
BacktrackBlack(1);//白皇后放完后在放置黑黄后
}else{
for(int i = 1 ; i <= n ; i++){//i-->列
if(a[row][i] == 1){
if(canPlaceWhite(row,i)){
a[row][i] = 2 ;//白皇后在棋盘放置后设置棋盘数为2
b[row] = i ;
BacktrackWhite(row+1);
a[row][i] = 1;//添加了这一句!!!这一句不能少,试探完后要恢复状态
}
}
}
}
}
public static void BacktrackBlack(int row ){
if(row > n ){
sum++;
}else{
for(int i = 1 ; i <= n ; i++ ){
if(a[row][i] == 1){
if(canPlaceBlack(row, i)){
c[row] = i;
BacktrackBlack(row+1);
}
}
}
}
}
}