题目:http://acm.hdu.edu.cn/showproblem.php?pid=2553
AC代码(C++):
#include <iostream> #include <algorithm> #define INF 0x3f3f3f3f using namespace std; int n; int queen[15]; bool vis[15]; int ans[15]; void dfs(int r) { if (r == n + 1) { ans[n]++; return; } bool flag; int i, j; for (i = 1; i <= n; i++) { if (vis[i])continue; flag = false; for (j = r - 1; j >= 1; j--) { if (i - queen[j] == r - j || i - queen[j] == j - r) { flag = true; break; } } if (flag)continue; queen[r] = i; vis[i] = true; dfs(r + 1); vis[i] = false; queen[r] = 0; } } int main() { memset(ans, 0, sizeof(ans)); for (n = 1; n <= 10; n++) { memset(vis, false, sizeof(vis)); dfs(1); } while (cin >> n) { if (n == 0)break; cout << ans[n] << endl; } //system("pause"); }总结: 水题. 很坑爹的是, 必须提前打表, 否则测试样例会多次测试导致超时.