格子游戏
【问题描述】
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
1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 int n,m; 5 char c; 6 int a,b; 7 struct node 8 { 9 int x,y; 10 }far[500][500],k1,k2; 11 node find(node k) 12 { 13 if((far[k.x][k.y].x==k.x)&&(far[k.x][k.y].y==k.y))return k; 14 far[k.x][k.y]=find(far[k.x][k.y]); 15 return far[k.x][k.y]; 16 } 17 int main() 18 { 19 freopen("game.in","r",stdin); 20 freopen("game.out","w",stdout); 21 scanf("%d%d",&n,&m); 22 for(int i=1;i<=n;++i) 23 for(int j=1;j<=n;++j) 24 { 25 far[i][j].x=i;far[i][j].y=j; 26 } 27 for(int i=1;i<=m;++i) 28 { 29 cin>>a>>b>>c; 30 if(c=='D') 31 { 32 k1=find(far[a][b]); 33 k2=find(far[a+1][b]); 34 } 35 if(c=='R') 36 { 37 k1=find(far[a][b]); 38 k2=find(far[a][b+1]); 39 } 40 if(k1.x==k2.x&&k1.y==k2.y) 41 { 42 printf("%d ",i);return 0; 43 } 44 else far[k1.x][k1.y]=k2; 45 } 46 printf("draw"); 47 return 0; 48 }