题意:有名的N皇后问题。输入N,求符合要求的N皇后排法有几个。
思路:看注释
#include<iostream>
#include<stack>
using namespace std;
#define MAXN 10 + 3
int list[MAXN];
int counts[MAXN];
int count = 0;
int n;
void search(int m) {
//m表示层数,一开始从0开始search(),程序会一直回朔到第n层
if (n == m) {
//因为遍历是从0开始的。这里也可以写成if (n - 1 == m - 1)
count ++;
return;
}
for (int i=0; i<n; i++) {
bool ok = true;
list[m] = i;
for (int j=0; j<m; j++) {
if (list[m] == list[j] || m + list[m] == j + list[j] || m - list[m] == j - list[j]) {
//对于第m层的每个可能的点i,与m层之前的m-1层进行比较,如果符合规则就search() m + 1 层
ok = false;
break;
}
}
if (ok) {
search(m + 1);
}
}
}
void init() {
for (int i=1 ;i<=10; i++) {
//打表
n = i;
count = 0;
search(0);
counts[i] = count;
}
}
int main() {
init();
while (cin>>n, n) {
//count = 0;
//search(0);
cout<<counts[n]<<endl;
}
return 0;
}