二、思路
设置两个int型数组p[]和hashTable[],分别记录已放置皇后列的行,和当前行是否被皇后占用。使用递归遍历列,判断当前列是否有皇后,如果没有则判断当前对角线是否有皇后。如果两项条件都符合则将皇后放置在此处然后继续遍历下一列。
二、代码
#include<cstdio> #include<cmath> #include<stdio.h> using namespace std; const int maxn = 11; int count = 0; //P[maxn]记录之前皇后所在列的行号,hashTable[maxn]记录当前排中是否有皇后 int n=0, p[maxn], hashTable[maxn] = { false }; //index为当前行的列 void bianli(int index) { //全部摆满了,方法数加一,递归结束 if (index == n + 1) { count++; return; } for (int i = 1; i <= n; i++) { //第i行没有皇后 if (hashTable[i] == false) { bool flag = true; //遍历之前的对角线上是否有皇后 for (int k = 1; k < index; k++) { //之前对角线上的皇后列号为k,行号为p[k],当前排为i,当前列为index,行减行,列减列 if (abs(k-index)==abs(p[k]-i)) { flag = false; break; } } //当前行列及对角线都没有皇后,flag为true if (flag) { //放置当前列的皇后 p[index] = i; //这一行已被占用 hashTable[i] = true; //递归处理下一行 bianli(index + 1); //递归结束,还原第i行的占用状态 hashTable[i] = false; } } } } int main() { scanf_s("%d",&n); bianli(1); printf("%d", count); }