格子游戲 二維並查集

格子游戲

時間限制: 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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章