格子游戲
時間限制: 1 Sec 內存限制: 128 MB
題目描述
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
解法:二維並查集
第一次遇到二維並查集,其實打個模板就好了,還是需要多多練習
AC代碼
#include<cstdio>
#define re register int
using namespace std;
struct node {
int x,y;
}fa[205][205];
int n,m;
inline node find(node k) {
if(k.x==fa[k.x][k.y].x&&k.y==fa[k.x][k.y].y) return k;
else {
fa[k.x][k.y]=find(fa[k.x][k.y]);
return fa[k.x][k.y];
}
}
int main() {
scanf("%d%d",&n,&m);
for(re i=0;i<=n;i++) {
for(re j=0;j<=n;j++) {
fa[i][j].x=i;
fa[i][j].y=j;
}
}
for(re i=1;i<=m;i++) {
int x,y; char op[5];
scanf("%d%d%s",&x,&y,op);
node k1,k2;
if(op[0]=='D') {
k1=find(fa[x][y]);
k2=find(fa[x+1][y]);
}
else {
k1=find(fa[x][y]);
k2=find(fa[x][y+1]);
}
if(k1.x==k2.x&&k1.y==k2.y) {
printf("%d",i);
return 0;
}
else fa[k1.x][k1.y]=k2;
}
printf("draw");
return 0;
}