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 }