这是一题简单的博弈论!!

所有的空白+边界的数字(个数为n)为一堆,容易推出其SG函数值为n%2+1;

其他所有的数字(个数为m)的SG值为m%2。

再就是用dfs将空白部分搜一下即可!(注意细节)

代码如下:

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<algorithm>
  4. #include<iomanip>
  5. #include<cmath>
  6. #include<cstring>
  7. #include<vector>
  8. #define MAX 1005
  9. #pragma comment(linker,"/STACK:1024000000,1024000000")
  10. using namespace std;
  11. int vis[MAX][MAX],m,n,k,tot,cnt,ans,num;
  12. int d[][]={{-,-},{-,},{-,},{,-},{,},{,-},{,},{,}};
  13. int cal(int i,int j)
  14. {
  15. int ans=;
  16. if(i->=){
  17. ans+=(vis[i-][j]==-);
  18. if(j->=) ans+=(vis[i-][j-]==-);
  19. if(j+<m) ans+=(vis[i-][j+]==-);
  20. }
  21. if(j->=){
  22. ans+=(vis[i][j-]==-);
  23. if(i+<n) ans+=(vis[i+][j-]==-);
  24. }
  25. if(j+<m){
  26. ans+=(vis[i][j+]==-);
  27. if(i+<n) ans+=(vis[i+][j+]==-);
  28. }
  29. if(i+<n) ans+=(vis[i+][j]==-);
  30. return ans;
  31. }
  32. void dfs(int a,int b)
  33. {
  34. int t,u,v;
  35. if(vis[a][b]==-) return;
  36. if(vis[a][b]>=){
  37. vis[a][b]=-;
  38. num++;tot++;
  39. return;
  40. }
  41. if(vis[a][b]==-){
  42. t=cal(a,b);
  43. tot++;
  44. vis[a][b]=-;
  45. if(t==){
  46. for(int i=;i<;i++){
  47. u=a+d[i][];
  48. v=b+d[i][];
  49. if(u>=&&u<n&&v>=&&v<m)
  50. dfs(u,v);
  51. }
  52. }
  53. else{
  54. num++;
  55. return ;
  56. }
  57. }
  58. else return ;
  59. }
  60. void solve()
  61. {
  62. int i,j,k,u,v;
  63. tot=;cnt=;ans=;
  64. for(i=;i<n;i++){
  65. for(j=;j<m;j++){
  66. if(vis[i][j]==-){
  67. int t=cal(i,j);
  68. if(t>) vis[i][j]=t;
  69. else{
  70. tot++;cnt++;
  71. num=;
  72. vis[i][j]=-;
  73. for(k=;k<;k++){
  74. u=i+d[k][];
  75. v=j+d[k][];
  76. if(u>=&&u<n&&v>=&&v<m)
  77. dfs(u,v);
  78. }
  79. ans^=(num%+);
  80. }
  81. }
  82. }
  83. }
  84. return ;
  85. }
  86. int main(){
  87. int t,i,j,u,v,w=;
  88. scanf("%d",&t);
  89. while(t--){
  90. scanf("%d%d%d",&n,&m,&k);
  91. for(i=;i<n;i++)
  92. for(j=;j<m;j++)
  93. vis[i][j]=-;
  94. for(i=;i<k;i++){
  95. scanf("%d%d",&u,&v);
  96. vis[u][v]=-;
  97. }
  98. solve();
  99. int ans1=(n*m-k-tot)%;
  100. printf("Case #%d: ",++w);
  101. if(ans1^ans) puts("Xiemao");
  102. else puts("Fanglaoshi");
  103. }
  104. return ;
  105. }

hdu 4678 Mine 博弈论的更多相关文章

  1. hdu 4678 Mine

    HDU 4678 把点开空地时会打开的一大片区域看成一块,题目中说到,在一盘游戏 中,一个格子不可能被翻开两次,说明任意两块空地不会包含相同的格子. 那么就可以看成一个组合游戏. 当空地旁边没连任何数 ...

  2. HDU 4678 Mine SG博弈

    http://acm.hdu.edu.cn/showproblem.php?pid=4678 自己太蠢...没学SG...还是浩神指点我SG精髓以后才A的这题...(第一题SG 这里子游戏之间没有影响 ...

  3. HDU 4678 Mine (2013多校8 1003题 博弈)

    Mine Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submis ...

  4. HDU 4678 Mine(博弈)

    Mine Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submi ...

  5. 2020杭电多校 10C / HDU 6879 - Mine Sweeper (构造)

    HDU 6879 - Mine Sweeper 题意 定义<扫雷>游戏的地图中每个空白格子的值为其周围八个格子内地雷的数量(即游戏内临近地雷数量的提示) 则一张地图的值\(S\)为所有空白 ...

  6. HDU 5512 Meeting 博弈论

    Meeting Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5512 ...

  7. hdu 4664 Triangulation 博弈论

    看到这题时,当时还不会做,也没搞懂sg函数,于是狠狠的钻研了下博弈论,渐渐的知道了sg函数…… 现在在来做这题就很容易了,1A 打表容易发现在80左右的时候就出现循环节了 代码如下: #include ...

  8. hdu 4678

    HDU 4768: Flyer 题意: 有N个社团,每个社团三个属性A,B,C,表示会向编号A+k*C的同学发传单(k=0,1,2...  && A+k*C <= B).题目保证 ...

  9. hdu 4023 Game 博弈论

    思路: 将15种分成5类: 1.1和2为一类: 2.3,4,5,6为一类: 3.7,8,9,10为一类: 4.11,12,13,14,15为一类: 5.15为一类. 比较各类的优先级,就会发现放置的顺 ...

随机推荐

  1. Xcode7中添加3DTouch

    首先是插件SBShortcutMenuSimulator的安装 1.git clone https://github.com/DeskConnect/SBShortcutMenuSimulator.g ...

  2. main与进程 线程

    你起一个CS游戏,这上CS游戏在操作系统中就是一个进程. 但是这个游戏一边在打枪,一边人在走动,一边还有音乐 ,打枪 , 走动 , 音乐 等都是一些线程. 线程不是由进程决定了. 也就是说:你在操作系 ...

  3. 引用、return

    C语言中没有引用,引用(reference)是c++对c语言的重要扩充.通俗点说,引用就是“起别名”.比如变量data,和它的引用 RefData.虽然名字不同,但是操作他们的时候,都操作的是相同的内 ...

  4. rabbitmq+haproxy+keepalived实现高可用集群搭建

    项目需要搭建rabbitmq的高可用集群,最近在学习搭建过程,在这里记录下可以跟大家一起互相交流(这里只是记录了学习之后自己的搭建过程,许多原理的东西没有细说). 搭建环境 CentOS7 64位 R ...

  5. 如何在Android SDK 下查看应用程序输出日志的方法

          该文章源于安卓教程网(http://android.662p.com),转载时要注明文章的来自和地址,感谢你的支持. 在Android程序中可以使用 android.util.Log 类来 ...

  6. 7.JAVA_SE复习(文件)

    文件和流 1.什么是节点流和处理流 InputStream & OutputStream Reader & Writer 乃节点流, 前面加File之类的名词 的节点流 其余加动词的均 ...

  7. [转]PHP5.5安装PHPRedis扩展

    phpredis是个人觉得最好的一个php-redis客户端,因为其提供的function与redis的命令基本一致,降低的了学习成本,同时功能也很全面. 一.linux安装方法 phpredis下载 ...

  8. php100 编程小技巧

    用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量,单引号则 不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的“函数”(译注:PHP手册中 ...

  9. Kakfa揭秘 Day7 Producer源码解密

    Kakfa揭秘 Day7 Producer源码解密 今天我们来研究下Producer.Producer的主要作用就是向Kafka的brokers发送数据.从思考角度,为了简化思考过程,可以简化为一个单 ...

  10. Cygwin安装与配置

    Cygwin可以在windows环境下模拟Linux系统,而且可以重用Linux下面丰富的脚本工具.windows的cmd太弱了.Cygwin是由Cygnus(天鹅座) Solution公司开发,不过 ...