【題目描述】
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
思路:將二維座標轉換成節點的編號
#include <bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
#define PII pair<int,int>
using namespace std;
const int N=4e5+5;
int fa[N],n,m,x,y;
char c;
int Find(int x)
{
if(fa[x]!=x)
fa[x]=Find(fa[x]);
return fa[x];
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> m;
for(int i=1;i<=n*n;i++)
fa[i]=i;
int flag=0;
for(int i=1;i<=m;i++)
{
cin >> x >> y >> c;
int z=(x-1)*n+y;
int u=Find(z),v;
if(c=='D')
v=Find(x*n+y);
else
v=Find(z+1);
if(u!=v)
fa[u]=v;
else
{
cout << i << endl,flag=1;
break;
}
}
if(!flag)
cout << "draw" << endl;
return 0;
}