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 #include5using
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 ...