zoukankan      html  css  js  c++  java
  • bzoj 4131: 并行博弈 (parallel)

    bzoj 4131: 并行博弈 (parallel)

    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,那么先手可以将它翻成0,然后一直翻它,必胜。

    因为所有操作一定会翻到(1,1)

    否则先手必败

    异或起来就是答案

    #include<cstdio>
    #include<iostream>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    char str[10005];
    int T,k,n,m,x,ans;
    int main()
    {
        scanf("%d", &T);
        while(T--){
            ans=0;
            scanf("%d",&k);
            while(k--){
                scanf("%d%d%d", &n, &m,&x);
                ans ^= x;
                for(int i=1;i<=n;i++)gets(str); 
            }
            if(ans)printf("lyp win
    ");
            else printf("ld win
    ");
        }
        return 0;
    }
  • 相关阅读:
    死磕 java同步系列之ReentrantLock源码解析(一)——公平锁、非公平锁
    死磕 java同步系列之AQS起篇
    死磕 java同步系列之自己动手写一个锁Lock
    死磕 java同步系列之synchronized解析
    死磕 java同步系列之volatile解析
    死磕 java同步系列之JMM(Java Memory Model)
    解决Linux下SSH超时自动断开
    Git常用命令
    JVM常用虚拟机命令汇总
    理解GC日志
  • 原文地址:https://www.cnblogs.com/liankewei/p/10358840.html
Copyright © 2011-2022 走看看