题目链接: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; }
原文:http://blog.csdn.net/mullerwch/article/details/21448961