sgu 224
来源:互联网 发布:2017程序员薪资报告 编辑:程序博客网 时间:2024/05/15 19:51
//dfs// k = 0, ans = 1;// k = 1, ans = n*n ;// k > n, ans = 0;//还可以进一步优化 // if (n - ps < k - count) rollback; 当剩余列数小于剩余棋子数时,回滚// 对称性优化, 第一个棋子放在某一列m行,和放在该列n-m+1// 直接用数组保存所有结果 --- 有些耍赖皮#include <stdio.h>int n, k;int stk[12];int ps = 0;int isOK(int m) { int i; for (i=0; i<ps; ++i) { if (m == stk[i]) { return 0; } if (stk[i] > 0 && abs(ps-i) == abs(m-stk[i])) { return 0; } } return 1;}int dfs() { int m = 1; int count = 0; int ans = 0; while (ps >= 0) { if (count == k) { ++ans; --ps; while (stk[ps] <=0) --ps; m = stk[ps] + 1; --count; continue; } if (ps >= n) { --ps; while (stk[ps] <= 0 && ps >= 0) --ps; m = stk[ps] + 1; --count; continue; } if (m > n) { stk[ps] = 0; ++ps; m = 1; continue; } if (isOK(m)) { stk[ps] = m; ++ps; m = 1; ++count; } else { ++m; } } return ans;}int main() { scanf("%d%d", &n, &k); if (k > n) { printf("0\n"); return 0; } if (k == 0) { printf("1\n"); return 0; } if (k == 1) { printf("%d\n", n*n); return 0; } printf("%d\n", dfs()); return 0;}