题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2553
题解:
经典的八皇后的问题,参考之前写的八皇后就可以解决了。http://blog.csdn.net/mullerwch/article/details/20623937
然而,这里的注意点是:将N皇后的所有可能性都先求解出来,然后进行题目中的输入输出的解答,否则每次输入都进行一次DFS,结果必然是TLE。
这里给出AC的代码,仅供参考:
/*
ID: 2553
Name: N皇后问题
LANG:C++
PREFERENCE: dfs
*/
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <cstring>
using namespace std;
int queen[15]; //表示第i行皇后的位置
int ans[15]; //N皇后的答案数目
void dfs(int now, int final){
if(now == final){
ans[final]++;
return;
}
int i,j;
for(i=0; i<final; ++i){
queen[now] = i;
bool flag = true;
for(j=0; j<now; ++j)
if(queen[now] == queen[j]||
queen[now]-now == queen[j]-j||
queen[now]+now == queen[j]+j){ //判断是否会相互攻击
flag = false;
break;
}
if(flag)
dfs(now+1, final);
}
return ;
}
int main(){
int i;
int n;
memset(ans, 0, sizeof(ans));
for(i=1; i<=10; ++i){
memset(queen, 0, sizeof(queen));
dfs(0, i);
}
while(scanf("%d", &n), n){
printf("%d\n", ans[n]);
}
return 0;
}