您的位置:首页 > 其它

2940: [Poi2000]条纹(Multi_SG)

2018-02-28 10:11 239 查看

2940: [Poi2000]条纹

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 114  Solved: 72
[Submit][Status][Discuss]

Description

      条纹游戏是一个双人的游戏。所需要的物品有一个棋盘以及三种颜色的长方形条纹,这三种颜色分别是红色、绿色和蓝色。所有的红色条纹的尺寸是c*1,所有的绿色条纹的尺寸是z*1,所有的蓝色条纹的尺寸是n*1,这里c,z,n是正整数。每种颜色的条纹每个游戏者都拥有无限多个。        一个棋盘是一个尺寸为p*1的长方形,由p个1*1的方格组成。        游戏者轮流走,每一步都是由一个游戏者任选一种长方形条纹覆盖到棋盘上,并要求遵循以下规则: l        条纹不能伸出棋盘之外。 l        不能覆盖在已有的条纹之上(即使部分也不行)。 l        条纹的边缘必须与棋盘方格的边缘相重叠。谁不能再走,谁就输了。   先手是指在游戏中第一个走的游戏者。那么是否不管后手怎么走,先手都有必胜策略呢? 任务: 写一个程序: l        读入条纹的尺寸以及至少一个棋盘的尺寸。 l        对每一个给出的棋盘判断先手是否必胜。 l        将结果输出。  

Input

 第一行包含三个整数c,z,n(1<=c,z,,n<=1000),表示三种条纹的长度,依次为红色,绿色以及蓝色。每两个数之间都用空格隔开。        文件的第二行包括一个整数m(1 <= m <= 1000)表示需要考虑的不同棋盘个数。以下3到m+2行每行包括一个整数p(1<=p<=1000)。第i+2行表示第i个棋盘的长度。  

Output

   应当包含m行。只有一个数字应当被写入文件的第i行: l        1—如果对第i个棋盘先手有必胜策略。 l        2—其它。  

Sample Input

1 5 1


3
1
5
6


Sample Output


1
1
2

 

code

#include<cstdio>
#include<cstring>
#include<set>

using namespace std;
int c,z,n,p,T;
int sg[1010][1010];

int get_SG(int l,int r) {
if (l > r) return 0;
if (sg[l][r]!=-1) return sg[l][r];
set<int>s;
for (int i=l; i<=(r-c+1); ++i)
s.insert(get_SG(l,i-1)^get_SG(i+c,r));
for (int i=l; i<=(r-z+1); ++i)
s.insert(get_SG(l,i-1)^get_SG(i+z,r));
for (int i=l; i<=(r-n+1); ++i)
s.insert(get_SG(l,i-1)^get_SG(i+n,r));
for (int j=0; ; ++j)
if (!s.count(j)) {sg[l][r]=j;break;}
return sg[l][r];
}
int main () {
memset(sg,-1,sizeof(sg));
sg[0][0] = 0;
scanf("%d%d%d%d",&c,&z,&n,&T);
while (T--) {
scanf("%d",&p);
if (get_SG(1,p)==0) puts("2");
else puts("1");
}
return 0;
}
View Code

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: