P1219 [USACO1.5]八皇后 Checker Challenge

DFS

基本思路:搜索 标记 AC

import java.util.Scanner;

public class Main {
static int[] a=new int[100];
static int[] b=new int[100];
static int[] c=new int[100];
static int[] d=new int[100];
static int n;
static int ret=0;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
int[] a=new int[n];
queen(1);
System.out.println(ret);
}

public static void queen(int i){
if(i>n){
ret++;
if(ret<=3){
for (int j = 1; j <= n; j++) {
System.out.print((a[j])+" ");
}
System.out.println();
}
return;
}
for(int j=1;j<=n;j++)//尝试可能的位置
{
if(b[j]==0&&c[i+j]==0&&d[i-j+n]==0)//如果没有皇后占领,执行以下程序
{
a[i]=j;//标记i排是第j个
b[j]=1;//宣布占领纵列
c[i+j]=1;
d[i-j+n]=1;
//宣布占领两条对角线
queen(i+1);//进一步搜索,下一个皇后
b[j]=0;
c[i+j]=0;
d[i-j+n]=0;
//(回到上一步)清除标记
}
}
}

}

注释:对角线d[i-j]后面必须加上一个n,因为i-j可能为负数,那么数组就会出错,所以将整体向右偏移n个单位(坐标偏移不会影响我们需要达到的目的),将所有可能变成正数;(因为i-j的最小值是-n+1,所以加上一个n就一定会变成一个正数)

本道题最重要的就是记录下皇后占领的格子(打标记的思想),通过此判断下一个皇后是否可以在某个位置,如果可以,则继续搜索下一个皇后可以在的位置,如果不行,则清除标记回到上一步,继续搜索;

可以先考虑六个皇后(即6*6网格),再将6改为n,并且输入n,就可以得出6到13个皇后的解了;

猜你喜欢

转载自www.cnblogs.com/lijiahui-123/p/12568636.html