【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); } } }
对于作者转载文章,欢迎继续转载。
对于作者原创文章,请注明出处之后转载。