格仔遊戲(並查集)

2022-07-18 19:51:17 字數 1764 閱讀 9284

alice和bob玩了乙個古老的遊戲:首先畫乙個 n×n

'>n×n

的點陣(下圖 n=3

'>n=3

)。接著,他們兩個輪流在相鄰的點之間畫上紅邊和藍邊:

直到圍成乙個封閉的圈(面積不必為 1

'>1

1)為止,「封圈」的那個人就是贏家。因為棋盤實在是太大了,他們的遊戲實在是太長了!

他們甚至在遊戲中都不知道誰贏得了遊戲。

於是請你寫乙個程式,幫助他們計算他們是否結束了遊戲?

輸入格式

輸入資料第一行為兩個整數 n

'>n

n 和 m

'>m

m。n'>n

n表示點陣的大小,m

'>m

m 表示一共畫了 m

'>m

m 條線。

以後 m

'>m

m 行,每行首先有兩個數字 (x,

y)'>(x,y)

(x,y),代表了畫線的起點座標,接著用空格隔開乙個字元,假如字元是 d

'>d

d,則是向下連一條邊,如果是 r

'>r

r 就是向右連一條邊。

輸入資料不會有重複的邊且保證正確。

輸出格式

輸出一行:在第幾步的時候結束。

假如 m

'>m

m 步之後也沒有結束,則輸出一行「draw」。

資料範圍1≤

n≤200'>1≤n≤200

1≤n≤200,1≤

m≤24000

'>1≤m≤24000

1≤m≤24000

輸入樣例:

3 5

1 1 d

1 1 r

1 2 d

2 1 r

2 2 d

輸出樣例:

4

乙個特別有意思的並查集,在這裡用map和pair來完成對座標的儲存。

1 #include2 #include3 #include4 #include5

using

namespace

std;

67 mapint,int>,int>m;89

const

int n = 40010;10

11int

p[n];

1213

int find(int

x)17

18void _union(int x,int

y)23

24bool issame(int x, int

y)27

28int

n,m,t;

2930

intmain()else

48if(!m.count()) m = t ++; //

因為map中不存在相同的元素,所以count的返回值只能是1或者0,0代表還沒有用到該點,1代表用到啦~

49if(!m.count()) m = t ++;

50if

(issame(m,m))

53_union(m,m);54}

55if(ans == -1

)else

60return0;

61 }

格仔遊戲 並查集

格仔遊戲題目 思路 若能夠形成自環,則兩點在連線之前屬於同乙個集合。並查集裸題,不過需要把二維狀態下座標對映到一維,這裡用乙個cnt不斷自增來對映,也可以將x,y從0開始a x y n x y 如下 include using namespace std const int n 210 int n,...

ssl2340 格仔遊戲 並查集

題目鏈結 有兩個人在玩遊戲,在乙個n n的矩陣的點上畫線,有如果有線封了圈那麼遊戲結束,給出一些操作,求在那一輪結束了遊戲,或沒有結束遊戲。用並查集把點相連,直到並查集形成環為止 include include using namespace std int n,m,x,y,father 40001...

並查集 並查集

本文參考了 挑戰程式設計競賽 和jennica的github題解 陣列版 int parent max n int rank max n void init int n int find int x else void union int x,int y else 結構體版 struct node ...