import java.util.Scanner;
//问题表述为:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或
//同一斜线上,问有多少种摆法。
public class N皇后 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] rec = new int[n];
dfs(0,n,rec);//从第0行开始
System.out.println(count);
}
static int count = 0;
public static void dfs(int row,int n,int[] arr) {
if(row==n) {//所有行的情况已经执行完了,没有任何冲突,就是一种摆法
count++;
}
//依次尝试在每一列上面放皇后
for(int col = 0;col<n;col++) {
//检查这个位置是否可以放,看看与前面皇后位置时候冲突
boolean ok = true;
for(int j = 0;j<row;j++) {
//arr[j]==col的意思是判断前面几行是否有皇后和该行的皇后位于同一列上
//j+arr[j] == col+row意思是:判断前面几行是否有皇后和该行的皇后位于主对角线上
//j-arr[j] == col-row意思是:判断前面几行是否有皇后和该行的皇后位于负对角线上
if(arr[j]==col||j+arr[j] == col+row||j-arr[j] == row - col) {
ok = false;
break;
}
}
//这个判断也相当与剪枝
if(ok) {
arr[row] = col;//标记
dfs(row+1,n,arr);//找下一行
arr[row] = 0;//回溯,但是这里也不用回溯,因为当执行完一遍后,也就是col加到1的时候,标记会覆盖掉前面的值。
}
}
}
}
dfs之n皇后问题-回溯与剪枝
最新推荐文章于 2024-03-10 22:51:25 发布