Alice和Bob玩了一個古老的游戲:首先畫一個n * n的點陣(下圖n = 3) 接著,他們兩個輪流在相鄰的點之間畫上紅邊和藍邊:
直到圍成一個封閉的圈(面積不必為1)為止,“封圈”的那個人就是贏家。因為棋盤實在是太大了(n <= 200),他們的游戲實在是太長了!他們甚至在游戲中都不知道誰贏得了游戲。於是請你寫一個程序,幫助他們計算他們是否結束了游戲?
輸入數據第一行為兩個整數n和m。m表示一共畫了m條線。以後m行,每行首先有兩個數字(x, y),代表了畫線的起點坐標,接著用空格隔開一個字符,假如字符是"D ",則是向下連一條邊,如果是"R "就是向右連一條邊。輸入數據不會有重復的邊且保證正確。
輸出描述 Output Description輸出一行:在第幾步的時候結束。假如m步之後也沒有結束,則輸出一行“draw”
樣例輸入 Sample Input3 5
1 1 D
1 1 R
1 2 D
2 1 R
2 2 D
4
數據范圍及提示 Data Size & Hintn <= 200
1 #include<iostream>
2 #include<cstdio>
3 using namespace std;
4 int map[1001][1001];
5 int now=1;
6 int f[1000001];
7 int find(int x)
8 {
9 if(f[x]!=x)
10 f[x]=find(f[x]);
11 return f[x];
12 }
13 void unionn(int r1,int r2)
14 {
15 f[r2]=r1;
16 }
17 int main()
18 {
19 int ans;
20 int flag=0;
21 int n,m;
22 int x1,y1;
23 int x2,y2;
24 char z;
25 cin>>n>>m;
26 for(int i=1;i<=n;i++)
27 for(int j=1;j<=n;j++)
28 {
29 map[i][j]=now;
30 now++;
31 }
32 for(int i=1;i<=n*n+20;i++)
33 f[i]=i;
34
35 //scanf("%d%d",&n,&m);
36 for(int i=1;i<=m;i++)
37 {
38 cin>>x1>>y1;
39 cin>>z;
40 if(z=='D')
41 {
42 x2=x1+1;
43 y2=y1;
44 }
45 else
46 {
47 x2=x1;
48 y2=y1+1;
49 }
50 int r1=find(map[x1][y1]);
51 int r2=find(map[x2][y2]);
52 if(r1!=r2)
53 unionn(r1,r2);
54 else
55 {
56 flag=1;
57 ans=i;
58 break;
59 }
60
61 }
62 if(flag==1)
63 cout<<ans<<endl;
64 else
65 {
66 cout<<"draw";
67 }
68 return 0;
69 }