//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;
}
sgu 224
最新推荐文章于 2021-04-29 16:21:04 发布