格子游戏 //假的

【问题描述】
  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<iostream>
 2 using namespace std;
 3 #include<cstdio>
 4 #include<cstring>
 5 int father[1000008];
 6 int node[10001][10001];
 7 
 8 
 9 /*int find(int x)
10 {
11     if(father[x]!=x)father[x]=find(father[x]);
12     else return x;
13 }*/
14 int nfather[1000001];
15 int main()
16 {
17     int N,M;
18     scanf("%d%d",&N,&M);
19     for(int i=1;i<=N;i++)
20     for(int j=1;j<=N;j++)
21     {
22         node[i][j]=i*10+j;
23         father[i*10+j]=i*10+j;
24     }
25     for(int i=1;i<=M;i++)
26     {
27         int a,b;char c;
28         cin>>a>>b>>c;
29         if(c=='R')
30         {
31             b=b+1;
32             father[node[a][b]]=father[node[a][b-1]];
33         }
34         if(c=='D')
35         {
36             a=a+1;
37             father[node[a][b]]=father[node[a-1][b]];
38         }
39         nfather[node[a][b]]++;
40         if(nfather[node[a][b]]>=2&&father[node[a-1][b]]==father[node[a][b-1]])
41         {
42             printf("%d",i);
43             return 0;
44         }    
45     }
46     return 0;
47 }

 

 
 
posted @ 2017-04-12 16:25  zzzzx  阅读(182)  评论(0编辑  收藏  举报