jzoj3552WC2014模拟2.6结论题并行博弈
Posted SSL_ZZL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jzoj3552WC2014模拟2.6结论题并行博弈相关的知识,希望对你有一定的参考价值。
【WC2014模拟2.6】并行博弈
题面
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
Data Constraint
对于10%的测试数据,一定是ld win;
对于30%的测试数据,n * m * K ≤ 20;
对于50%的测试数据,n * m ≤ 20;
对于所有的测试数据,n * m * K ≤ 10^5,T ≤ 20。
解题思路
“两个聪明绝顶的人”(doge
先考虑只有一场游戏
当(1,1)点是黑色,先手赢;反之,后手赢
- 证明:当(1,1)点是黑色,先手点掉黑色;后手不管点其他的哪个点,(1,1)都会变成黑色,于是就可以一直点
到最后棋盘就会变成只剩(1,1)这一个黑点,由先手点掉
再考虑多场游戏
当 当前棋盘 先手赢时,那么TA点掉最后一个点,下一盘游戏TA就是后手了,继续套用上面 一场游戏 的结论
//tips
由于异或过于巧妙,这里给出所有情况 (dalao无需在意)
- k = 0, x = 1:k ^ x = 1(上盘lyp赢,在这盘先手变成后手;x表示这盘(1,1)为黑点,先手赢;ld赢,那么这盘lyp输(k = 1))
- k = 0, x = 0:k ^ x = 0(上盘lyp赢,在这盘先手变成后手;白点,后手赢;lyp赢(k = 0))
- k = 1, x = 1:k ^ x = 0(上盘lyp输,在这盘是先手;黑点,先手赢;lyp赢)
- k = 1, x = 0:k ^ x = 1(lyp先手;白点,后手赢;lyp输)
md,我们就有个叫lyp的,写起来巨奇怪
Code
#include <iostream>
#include <cstdio>
using namespace std;
int main() {
int T, n, m, x, k;
scanf("%d", &T);
while(T--) {
scanf("%d", &k);
int ok = 0;
while(k--) {
scanf("%d %d", &n, &m);
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++) {
scanf("%d", &x);
if(i == 1 && j == 1)
ok = ok xor x;
}
}
if(ok)printf("lyp win\\n");
else printf("ld win\\n");
}
}
以上是关于jzoj3552WC2014模拟2.6结论题并行博弈的主要内容,如果未能解决你的问题,请参考以下文章