题目描述
在n×n格的国际象棋上摆放n个皇后(0<=n<=10),使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
输入
8
输出
92
Note:回溯求解,到达递归边界前的某层,不需要往下求解,可以直接返回上一层
import java.util.Scanner;
public class Main{
public static int count;
public static int n = 0,maxn = 11,p[]=new int[maxn];
public static boolean[] hashTable = new boolean[maxn];
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
generateP(1);
System.out.println(count);
}
public static void generateP(int index) {
if (index == n+1) {
count++;
return ;
}
for (int x = 1; x<= n; x++) {
if (hashTable[x] == false) {
boolean flag = true;
for (int pre = 1; pre<index; pre++) {
//遍历之前的皇后
if(Math.abs(index-pre) == Math.abs(x-p[pre])) {
//p[]从第一列开始记录第一列皇后在哪个位置
//x,pre表示每行
flag = false;//不合法
break;
}
}
if(flag)//如果可以把皇后放在第x行
{
p[index] = x;//令index列皇后的行号为x行
hashTable[x] = true;//第x行已被占用
generateP(index+1);
//这里不能写index++,也不能写++index
//这样就变成index本身也自增了,而后面还有循环呢
hashTable[x] = false;//递归完毕,还原第x行为未被占用
}
}
}
}
}