【P2361】yyy棋(博弈论+贪心+模拟)

这个题看上去本来不好处理,然而善意的题面已经基本告诉你做法了,小时候玩的那个游戏就是代码的核心。动动脑子想想,如果长和宽的积是奇数,那么一定要先手,如果是偶数,那么后手就会获胜。

好了,那么怎么处理对称情况呢,随便画一个小棋盘试一试,很容易得出是x-i+1和m-y+1。这之后就是颜色的问题了,因为题目有颜色的限制和对方耍赖这一操作,所以我们每一次放棋子的颜色也有要求。

再画一个小棋盘模拟一下,容易得出是偶数时要放不一样的,奇数时放一样的。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define re register
#define wc 0.0000000001
using namespace std;
int n,m,map[11][11],t,x,a[100001],y,c,cc;
int main()
{
    cin>>n>>m;
    memset(map,0,sizeof(map));
    if(n*m%2==1)
    {
        cout<<"First"<<endl<<n/2+1<<" "<<m/2+1<<" "<<1<<endl;
        map[n/2+1][m/2+1]=1;
        while(cin>>x>>y>>c)
        {
            if(c==0)
            cc=-1;
            else
            cc=1;
            if(x+1<=n&&map[x+1][y]==cc||x-1>0&&map[x-1][y]==cc||y+1<=m&&map[x][y+1]==cc||y-1>0&&map[x][y-1]==cc)
            {
                cout<<"Buwanle";
                return 0;
            }
            map[x][y]=cc;
            cout<<n-x+1<<" "<<m-y+1<<" "<<c<<endl;
            map[n-x+1][m-y+1]=cc;
        }
    }else
    {
        cout<<"Second"<<endl; 
        while(cin>>x>>y>>c)
        {
            if(c==0)
            cc=-1;
            else
            cc=1;
            if(x+1<=n&&map[x+1][y]==cc||x-1>0&&map[x-1][y]==cc||y+1<=m&&map[x][y+1]==cc||y-1>0&&map[x][y-1]==cc)
            {
                cout<<"Buwanle";
                return 0;
            }
            map[x][y]=cc;
            cout<<n-x+1<<" "<<m-y+1<<" "<<(c^1)<<endl;
            map[n-x+1][m-y+1]=cc*(-1);
        }
    }
}

 

posted @ 2018-02-07 15:17  ~victorique~  阅读(260)  评论(0编辑  收藏  举报
Live2D