Description
Alice和Bob玩了一个古老的游戏:首先画一个n * n的点阵,接着,他们两个轮流在相邻的点之间画上红边和蓝边。直到围成一个封闭的圈(面积不必为1)为止,“封圈”的那个人就是赢家。因为棋盘实在是太大了(n <= 200),他们的游戏实在是太长了!他们甚至在游戏中都不知道谁赢得了游戏。于是请你写一个程序,帮助他们计算他们是否结束了游戏?
Input
多组测试数据。
输入数据第一行为两个整数n和m。m表示一共画了m条线。
以后m行,每行首先有两个数字(x, y),代表了画线的起点坐标,接着用空格隔开一个字符,假如字符是"D ",则是向下连一条边,如果是"R "就是向右连一条边。输入数据不会有重复的边且保证正确。
Output
输出一行:在第几步的时候结束。假如m步之后也没有结束,则输出一行“draw”。
Sample Input
3 51 1 D
1 1 R
1 2 D
2 1 R
2 2 D
Sample Output
4
分析:这题较基本的并查集改进了一点,涉及到结构体了,所以要在原基础上做稍微的改变即可= =
参考代码:
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<vector>
#include<iostream>
using namespace std;
const int maxn = 200+10;
int n,m;
typedef struct node{
int x;
int y;
}parent;
parent pre[maxn][maxn];
parent k1,k2;
parent Find( node k)
{
if( k.x == pre[k.x][k.y].x && k.y == pre[k.x][k.y].y)
return k;
return pre[k.x][k.y] = Find( pre[k.x][k.y]);
}
int main()
{
while( ~scanf("%d%d",&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;
}
}
int u,v;
char ch;
int ans = 0;
int flag = 0;
for( int i = 1; i <= m; i++)
{
scanf("%d%d",&u,&v);
getchar();
scanf("%c",&ch);
//printf("%d %d %c\n",u,v,ch);
if( flag)
continue;
if( ch == 'D')
{
k1 = Find(pre[u][v]);
k2 = Find(pre[u+1][v]);
}
if( ch == 'R')
{
k1 = Find(pre[u][v]);
k2 = Find(pre[u][v+1]);
}
if( k1.x == k2.x && k1.y == k2.y)
{
ans = i;
flag = 1;
}
else
pre[k1.x][k1.y] = k2;
}
if( flag)
printf("%d\n",ans);
else
printf("draw\n");
}
return 0;
}