原题链接[USACO1.5]八皇后 Checker Challenge - 洛谷https://www.luogu.com.cn/problem/P1219 典型dfs例题,注意回溯过程中不要过度复原。
import java.util.Scanner;
public class Main {
static int map[][],ans[];//map:棋盘,ans:解
static int n,count;//count:计数
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
map=new int[n][n];//创建n*n列棋盘
ans=new int[n];
count=0;
dfs(0);
System.out.println(count);
}
static void dfs(int index) {
if(index>=n) {
count++;
if(count<=3) {//输出解
for(int i=0;i<n;i++) {
System.out.print(ans[i]+" ");
}
System.out.println();
}
return;
}
else
for(int i=0;i<n;i++) {
if(map[index][i]==0) {
ans[index]=i+1;
//标记该位置被皇后占领
map[index][i]++;
int sub=1;
for(int j=index+1;j<n;j++) {
//标记该皇后的列
map[j][i]++;
//标记该皇后的对角线
if(i+sub>=0&&i+sub<n) {
map[j][i+sub]++;
}
if(i-sub>=0&&i-sub<n) {
map[j][i-sub]++;
}
sub++;
}
dfs(index+1);
/*----回溯----*/
sub=1;
map[index][i]--;//回溯//重要提醒,回溯过程中不要把不是当前皇后所占领的列和对角线也一并复原了
for(int j=index+1;j<n;j++) {//因为可能存在此皇后的对角线与之前皇后的列存在重合。
//如果采用置0或者置1的的行为进行复原会导致不该复原的也复原了.
map[j][i]--;
if(i+sub>=0&&i+sub<n) {
map[j][i+sub]--;
}
if(i-sub>=0&&i-sub<n) {
map[j][i-sub]--;
}sub++;
}
}
}
}
}