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;}


原创粉丝点击