poj解题报告——3537
2015-08-20 10:10
337 查看
题意
有个2人玩的游戏在一个规模为1*n的棋盘上进行,每次一个人选择一个地方画上'X',一旦某个人画上X后出现了连续3个X,那么这个人就赢了。给n(3≤n≤=2000)问谁会赢。
题解
考虑到如果画上一个X,就会有临近区域不能画X,也就是下一个人能画X的区域就变了,那么问题可以转换为谁不能画X谁就输了。
接着考虑每次画X的转移情况,最简单的就是画最左边的1~3个格子,这时剩下还有n-3~n-5个连续区域能画;如果画在4~n-3位置,就会把原问题分成两个子问题,都是SG博弈问题,所以直接求两者异或就行了。
有个2人玩的游戏在一个规模为1*n的棋盘上进行,每次一个人选择一个地方画上'X',一旦某个人画上X后出现了连续3个X,那么这个人就赢了。给n(3≤n≤=2000)问谁会赢。
题解
考虑到如果画上一个X,就会有临近区域不能画X,也就是下一个人能画X的区域就变了,那么问题可以转换为谁不能画X谁就输了。
接着考虑每次画X的转移情况,最简单的就是画最左边的1~3个格子,这时剩下还有n-3~n-5个连续区域能画;如果画在4~n-3位置,就会把原问题分成两个子问题,都是SG博弈问题,所以直接求两者异或就行了。
#include<cstdio> #include<cstring> #include<iostream> using namespace std; int sg[2005]; bool temp[2005]; int main() { sg[0]=0; sg[1]=1; sg[2]=1; sg[3]=1; sg[4]=2; sg[5]=2; for(int i=6;i<=2000;i++) { memset(temp,0,sizeof(temp)); temp[sg[i-3]]=temp[sg[i-4]]=temp[sg[i-5]]=1; for(int j=1;j<=i-5-j;j++) temp[sg[j]^sg[i-5-j]]=1; for(int j=0;j<=2000;j++) if(!temp[j]) { sg[i]=j; break; } } int n; while(scanf("%d",&n)!=EOF) { printf("%d\n",sg ?1:2); } return 0; }
相关文章推荐
- 如何在android 系统 C/C++ 层中添加 log 信息
- 统计学习笔记(1)——统计学习方法概论
- Power of Two
- 题目1185:特殊排序
- Objective-C语法之代码块(block)的使用
- C#中override和overload的区别
- 时间问题
- bootstrap3 input 输入框图标背景
- xxresult(28): error C2825: '_Fty': 当后面跟“::”时必须为类或命名空间
- Xcode编程问题小结
- JavaScript 自动分页插件 datatables
- 纯javascript模仿微信打飞机小游戏
- centos7 安装配置ceph
- Effective Objective-C 2.0 第2条:在类的头文件中尽量少引入其它头文件
- URLConnection的连接、超时、关闭用法总结
- ./configure --prefix --with解释
- redhat6.5安装oracle11g安装界面乱码
- 15.8.19笔记
- PAT-PAT (Advanced Level) Practise 1001. A+B Format (20) 【二星级】
- 机房收费之组合查询