记录编号 311876 评测结果 AAAAAAAAAA
题目名称 [USACO Mar]石子游戏 最终得分 100
用户昵称 Gravatar404 是否通过 通过
代码语言 C++ 运行时间 0.031 s
提交时间 2016-09-25 14:45:50 内存使用 1.31 MiB
显示代码纯文本
  1. #include<cstdio>
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<queue>
  5. using namespace std;
  6. int ans[2<<16];
  7. int n;
  8. int vis[2<<16],sum=1;
  9. bool flag;
  10. int calc(int x)
  11. {
  12. int cnt=0;
  13. while(x)
  14. {
  15. if(x&1)
  16. cnt++;
  17. x=x>>1;
  18. }
  19. return cnt;
  20. }
  21. void dfs(int now,int step)
  22. {
  23. if(now==0&&step>1&&step<sum+1)
  24. return;
  25. if(now==0&&step==sum+1){
  26. flag=1;
  27. for(int i=1;i<=step;i++){
  28. for(int j=1;j<=n;j++)
  29. if(ans[i]&(1<<(j-1)))printf("X");
  30. else printf("O");
  31. printf("\n");
  32. }
  33. return;
  34. }
  35. if(step+calc(now)>sum+1)
  36. return;
  37. for(int i=1;i<=n;i++)
  38. {
  39. int nx=now^(1<<(i-1));
  40. if(nx!=0&&vis[nx])continue;
  41. if(nx==0&&vis[nx]==1){
  42. vis[nx]=2,ans[step+1]=nx;
  43. dfs(nx,step+1);
  44. ans[step+1]=0,vis[nx]=1;
  45. if(flag)return;
  46. }
  47. else if(nx!=0&&vis[nx]==0){
  48. vis[nx]=1,ans[step+1]=nx;
  49. dfs(nx,step+1);
  50. ans[step+1]=0,vis[nx]=0;
  51. if(flag)return;
  52. }
  53. else
  54. continue;
  55. }
  56. }
  57. int main()
  58. {
  59. freopen("rocksa.in","r",stdin);
  60. freopen("rocksa.out","w",stdout);
  61. scanf("%d",&n);
  62. for(int i=1;i<=n;i++)sum=sum*2;
  63. ans[1]=0,vis[0]=1;
  64. dfs(0,1);
  65. return 0;
  66. }