bzoj 4131: 并行博弈(博弈)

4131: 并行博弈

Time Limit: 10 Sec   Memory Limit: 256 MB
Submit: 42   Solved: 29
[ Submit][ Status][ Discuss]

Description

lyp和ld在一个n*m的棋盘上玩翻转棋,游戏棋盘坐标假设为(x, y),1 ≤ x ≤ n,1 ≤ y ≤ m,这个游戏的游戏的的游戏规则如下:
每次可以操作坐标为 (x, y) 的棋子,要求棋子 (x, y) 必须是黑色,并且同时翻转所有棋子坐标 (x’, y’) 满足 x’≤x, y’≤y。
lyp觉得这样还不够过瘾,于是乎他打算同时玩 k 个这样的游戏, 每次可以对其中某一个游戏进行操作,lyp先手,ld后手,两人轮流进行操作,最后无法进行操作的人判输,现在给你这个游戏的局面,要求输出是先手必胜(“lyp win”)还是后手必胜(“ld win”)。

Input

第一行一个数T,表示数据组数。
接下来T组数据,对于每一组数据:
接下来一行一个数K,表示有多少个游戏在进行中,
接下来K部分,每部分第一行两个数n,m表示棋盘大小,
接下来n行,每行m个数,0 表示这个棋子是白色,1表示为黑色,第一行第一列代表棋子坐标(1,1)。

Output

对于每一组数据,换行输出先手必胜(“lyp win”)还是后手必胜(“ld win”),输出不包含引号。

Sample Input

1
1
2 2
1 1
1 0

Sample Output

lyp win


为什么这么水的题没人写。。

只要(1,1)是黑色那么先手必胜,否则先手必败

证明很简单:

很显然每个人无论怎么操作都一定会改变格子(1,1)的颜色,而当面对全白色的人必败,证毕


而这题是多个棋盘,那就和尼姆博奕一样么,将所有结果异或起来就ok了

用gets()不要太快,直接从1000ms+变成76ms

#include<stdio.h>
char str[10005];
int main(void)
{
	int T, k, n, m, i, x, ans;
	scanf("%d", &T);
	while(T--)
	{
		ans = 0;
		scanf("%d", &k);
		while(k--)
		{
			scanf("%d%d%d", &n, &m, &x);
			ans ^= x;
			for(i=1;i<=n;i++)
				gets(str+1);
		}
		if(ans)
			printf("lyp win\n");
		else
			printf("ld win\n");
	}
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值