二、代码
#include<cstdio> #include<cmath> #include<stdio.h> using namespace std; const int maxn = 11; int count = 0; //P为当前排列,hashTable记录整数x是否已经在P中 int n, P[maxn], hashTable[maxn] = { false }; //当前处理排列的第index号位 void generateP(int index) { if (index == n + 1) { count++; return; } for (int x = 1; x <= n; x++)//第x行 { if (hashTable[x] == false)//第x行还没有皇后 { bool flag = true;//flag表示当前皇后不会和之前的皇后冲突 for (int pre = 1; pre < index; pre++)//遍历之前的皇后 {//第index行的皇后的行号为x,第pre列皇后的行号为P[pre] if (abs(index - pre) == abs(x - P[pre])) { flag = false;//与之前的皇后在一条对角线,冲突 break; } } if (flag)//如果可以把皇后放在第x行 { P[index] = x;//令第index列皇后的行数为x hashTable[x] = true;//第x行已经被占用 generateP(index + 1);//递归处理第index+1行皇后 hashTable[x] = false;//递归完毕,还原第x行为为占用状态 } } } } int main() { scanf_s("%d", &n); generateP(1); printf("%d\n", count); return 0; }View Code