tyvj 1567:

博弈,题目给的数据是不超过1000位,所以这题应该找规律求解。

我是将30以内的sg值值求出来,然后规律就很容易看出来啦。

求sg值:

#include <stdio.h>
#include <string.h>int sg[100][100];int getsg(int x, int y)
{int i;if(sg[x][y] != -1)return sg[x][y];bool vis[100];memset(vis, 0, sizeof(vis));for(i = 1; i < x; i++)vis[getsg(x - i, i)] = 1;for(i = 1; i < y; i++)  vis[getsg(y - i, i)] = 1;for(i = 0; i < 100; i++)if(vis[i] == 0)break;return sg[x][y] = sg[y][x] = i;
}int main (void)
{memset(sg, -1, sizeof(sg));int i, j;for(i = 0; i < 100; i++)sg[1][i] = sg[i][1] = 1;for(i = 1; i <= 30; i ++)for(j = 1; j <= 10; j++)getsg(i, j);//getsg(20, 20);//开始这样写,但是结果不对for(i = 1; i <= 30; i ++){for(j = 1; j <= 10; j++){if(sg[i][j] != 0)printf("1 ");elseprintf("0 ");}printf("\n");}return 0;
}

打出来的结果:

1 1 1 1 1 1 1 1 1 1
1 0 0 1 1 1 0 0 1 1
1 0 0 1 1 1 0 0 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 0 0 1 1 1 0 0 1 1
1 0 0 1 1 1 0 0 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 0 0 1 1 1 0 0 1 1
1 0 0 1 1 1 0 0 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 0 0 1 1 1 0 0 1 1
1 0 0 1 1 1 0 0 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 0 0 1 1 1 0 0 1 1
1 0 0 1 1 1 0 0 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 0 0 1 1 1 0 0 1 1
1 0 0 1 1 1 0 0 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1

恩 除此之外还有一种思考方式,可以直接找到规律,上面sg函数是以二维来思考的,我们也可以换作一维,那么n,就代表已经将其中一堆吃完,剩下那一堆将要被分割的糖果数是n。

当n = 1时,先手胜。

当n = 2,因为只能分成(1, 1)(胜, 胜), 所以2是必败的。

当n = 3,可以分成(2, 1)(败, 胜),那么后手在面对(2, 1)这个状态的时候肯定是吃掉2这堆,留下1这堆,因为通过前面的分析知道分割1可以保证胜利,这样后手就会赢,所以3是必败的。

当n = 4时, 可以分成(2, 2)(败, 败), (1, 3)(胜, 败),先手肯定要将两个必败态留给对手,所以肯定会选择分成(2, 2)。

当n = 5时, 可以分成(2, 3)(败, 败), (1, 4)(胜, 胜), 先手选择分成(2, 3)保证对手输。

也就是说如果n的后继状态中有一种分法(a, b),其中a和b都是必败的,那么n是必胜的,否则必败。

………………

推个20或者30的应该就可以看出规律:

1     2     3     4     5     6     7     8     9    10

1     0     0     1     1     1     0     0     1     1

11  12   13   14  15   16   17  18   19   20

1     0     0     1     1     1     0     0     1     1

(做题的时候如果头脑清楚思维敏捷,这应该也是不错的方法,但是感觉就是不太适合我_(:з」∠)_)

找到规律就很好写了~

#include <stdio.h>
#include <string.h>char a[10010], b[10010];int yes(char x)
{if(x == '1' || x == '4' || x == '5' || x == '6' || x == '9' || x == '10')return 1;return 0;
}int f(char x)
{if(x == '2' || x == '3' || x == '7' || x == '8')return 0;return 1;
}int main (void)
{while(scanf("%s %s", a, b) != EOF){//只要判断最后一位 int len1 = strlen(a), len2 = strlen(b);if(yes(a[len1 - 1]) || yes(b[len2 - 1]))printf("Matrix67\n");else{if(f(b[len2 - 1]) || f(a[len1 - 1]))printf("Matrix67\n");elseprintf("Shadow\n");     }}return 0;
}

吃糖果游戏(tyvj 1567)相关推荐

  1. P1567 吃糖果游戏

    原题: 描述     Matrix67和Shadow正在做一个小游戏.     桌子上放着两堆糖果,Matrix67和Shadow轮流对这些糖果进行操作.在每一次操作中,操作者需要吃掉其中一堆糖果,并 ...

  2. vijos1196|吃糖果游戏|博弈论

    描述 Matrix67和Shadow正在做一个小游戏. 桌子上放着两堆糖果,Matrix67和Shadow轮流对这些糖果进行操作.在每一次操作中,操作者需要吃掉其中一堆糖果,并且把另一堆糖果分成两堆( ...

  3. Vijos P1196吃糖果游戏[组合游戏]

    描述 Matrix67和Shadow正在做一个小游戏. 桌子上放着两堆糖果,Matrix67和Shadow轮流对这些糖果进行操作.在每一次操作中,操作者需要吃掉其中一堆糖果,并且把另一堆糖果分成两堆( ...

  4. vijos1196吃糖果游戏

    描述 Matrix67和Shadow正在做一个小游戏. 桌子上放着两堆糖果,Matrix67和Shadow轮流对这些糖果进行操作.在每一次操作中,操作者需要吃掉其中一堆糖果,并且把另一堆糖果分成两堆( ...

  5. Phaser.js开发-怪物吃糖果

    什么是怪物要糖果? 当我开始制作游戏,首先确定核心玩法,并尝试迅速建立了一个游戏原型.在这个案例中,我们从一个相当简单的演示 发展出来的游戏名字叫 怪物要糖果 . 首先我会告诉你项目的结构,所以你可以 ...

  6. 吃豆豆游戏的C语言程序码,C++实现基于控制台界面的吃豆子游戏

    本文实例讲述了C++实现基于控制台界面的吃豆子游戏.分享给大家供大家参考.具体分析如下: 程序运行界面如下所示: ESC键可退出游戏. main.cpp源文件如下: #include "li ...

  7. 手机吞吃蛇游戏的设计与开发

    为什么80%的码农都做不了架构师?>>>    J2ME(Java 2 Micro Edition) 是近年来随着各种不同设备,尤其是移动通信设备的飞速发展而诞生的一项新的开发技术. ...

  8. 信息学奥赛一本通 1193:吃糖果 | OpenJudge NOI 2.6 1944:吃糖果

    [题目链接] OpenJudge NOI 2.6 1944:吃糖果 注:ybt 1193:吃糖果 页面打不开,可以在OpenJudge做该题. [题目考点] 1. 递推/递归 2. 搜索 [解题思路] ...

  9. 信息学奥赛一本通 2069:【例2.12】糖果游戏

    [题目链接] ybt 2069:[例2.12 ]糖果游戏 [题目考点] 1. 复合赋值表达式 表格中两列对应写法是等价的 写法1 写法2 a = a + b a += b a = a - b a -= ...

最新文章

  1. linux 常用快捷键
  2. 计算机视觉:基于眼疾分类数据集iChallenge-PM图像分类经典模型剖析(LeNet,AlexNet,VGG,GoogLeNet,ResNet)
  3. switch语句可以被代替吗_大空间建筑内的消防水炮可以代替喷淋装置吗
  4. JavaFX之TableView
  5. leetcode —— 938. 二叉搜索树的范围和
  6. 了解计算机中的信息编码教案,五年级下册信息技术《奇妙的编码》教学设计
  7. 基于JAVA+Servlet+JSP+MYSQL的中小型财务管理系统
  8. Python【WINAPI】钩子程序获取账号密码等键盘输入信息
  9. 851. 喧闹和富有
  10. Redis实战(十三)Redis的三种集群方式
  11. JavaScript匿名函数和回调函数
  12. atitit.常用编程语言的性能比较 c c++ java
  13. linux vim yy,linux vim的使用方法
  14. html页面上传图片回显,html js 上传图片并回显
  15. 按搜索量排名前100位访问量最高的网站(截至2020年)
  16. 2022年全球及中国多功能压力锅市场份额预测与投资竞争格局调查报告
  17. php文件是不是死链,怎么判断网站的链接是不是死链接? 百度搜索标准死链官方文档...
  18. php(magento),magento在本地php7上安装方法
  19. 浅谈虚拟机的垃圾回收
  20. 区块链究竟是如何工作的?

热门文章

  1. 【PS/AI】2021新年金色装饰背景矢量素材
  2. 文本聚类算法Java实现
  3. python - ffmpeg和moviepy:gif 转mp4
  4. nginx配置详解(容器、负载)—官方原版
  5. (SSM解析错误)$%7BpageContext.request.contextPath%7D/account/save
  6. 相机标定-opencv单应性矩阵实现平面坐标标定(kinect v1)
  7. 电脑新加内存条后 游戏崩溃 浏览器卡死 电脑蓝屏
  8. 详解:一次HTTP请求的全过程
  9. 用户访问我计算机不用凭据,如何进行凭据管理实现自动登录网络
  10. js可以打开mat文件吗_企业微信最大可以传多大文件?企业微信发送文件有限制吗?...