题目描述
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 <bits/stdc++.h>
using namespace std;
const int N=40005;
int n,m;
int fa[N];
int getfa(int x){
if(fa[x]==x)return x;
return fa[x]=getfa(fa[x]);
}
void merge(int x,int y){
int fx=getfa(x),fy=getfa(y);
if(fx==fy)return;
fa[fx]=fy;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=0;i<n*n;i++){
fa[i]=i;
}
for(int i=0;i<m;i++){
int x,y;char c;
cin>>x>>y>>c;
int t=(x-1)*n+y,t1;
if(c=='D')t1=t+n;
else t1=t+1;
if(getfa(t)==getfa(t1)){
cout<<i+1;
n=-1;
break;
}else merge(t,t1);
}
if(n!=-1)cout<<"draw";
}