问题 O: 【例4-8】格子游戏
时间限制: 1 Sec 内存限制: 128 MB
提交: 15 解决: 11
[提交][状态][讨论版][命题人:quanxing]
题目描述
Alice和Bob玩了一个古老的游戏:首先画一个n × n的点阵(下图n = 3)
接着,他们两个轮流在相邻的点之间画上红边和蓝边:
直到围成一个封闭的圈(面积不必为1)为止,“封圈”的那个人就是赢家。因为棋盘实在是太大了(n ≤ 200),他们的游戏实在是太长了!他们甚至在游戏中都不知道谁赢得了游戏。于是请你写一个程序,帮助他们计算他们是否结束了游戏?
输入
输入数据第一行为两个整数n和m。m表示一共画了m条线。以后m行,每行首先有两个数字(x, y),代表了画线的起点坐标,接着用空格隔开一个字符,假如字符是"D ",则是向下连一条边,如果是"R "就是向右连一条边。输入数据不会有重复的边且保证正确。
输出
输出一行:在第几步的时候结束。假如m步之后也没有结束,则输出一行“draw”。
样例输入
3 5 1 1 D 1 1 R 1 2 D 2 1 R 2 2 D
样例输出
4
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<stack>
#include<queue>
#define inf 0x3f3f3f3f
using namespace std;
struct node
{
int x,y;
}pre[201][201],k1,k2;
int n,m,a,b;
char k;
node find(node n1)
{
if(pre[n1.x][n1.y].x==n1.x&&pre[n1.x][n1.y].y==n1.y)return n1;
else return pre[n1.x][n1.y]=find(pre[n1.x][n1.y]);
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
pre[i][j].x=i;
pre[i][j].y=j;
}
for(int i=0;i<m;i++)
{
cin>>a>>b>>k;
if(k=='D')
{
k1=find(pre[a][b]);
k2=find(pre[a+1][b]);
}
else if(k=='R')
{
k1=find(pre[a][b]);
k2=find(pre[a][b+1]);
}
if(k1.x==k2.x&&k1.y==k2.y)
{
cout<<i+1<<endl;
return 0;
}
else pre[k2.x][k2.y]=k1;
}
cout<<"draw"<<endl;
return 0;
}