1347:【例4-8】格子遊戲
阿新 • • 發佈:2019-05-16
define 重復 esp 描述 using c++ bob namespace raw
【題目描述】 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> using namespace std ; typedef long long LL ; inline LL rd() { register LL x = 0 , f = 1 ; register char c ; #define gc c = getchar() while(isspace(gc)) ; if(c == '-') f = -1 , gc ; while(x = (x<<1) + (x<<3) + (c&15) , isdigit(gc)) ; return x * f ; #undef gc } const int inf = INT_MAX >> 1 ; int n , m ; const int N = 200 + 5 ; struct node { int x , y ; }fa[N][N] ; inline node find(node x) { return fa[x.x][x.y].x == x.x && fa[x.x][x.y].y == x.y ? x : fa[x.x][x.y] = find(fa[x.x][x.y]) ; } signed main() { ios::sync_with_stdio(false) ; cin >> n >> m ; for(register int i=1;i<=n;i++) for(register int j=1;j<=n;j++) fa[i][j].x = i , fa[i][j].y = j ; node xx , yy ; for(register int i=1;i<=m;i++) { register int x , y ; register char c ; cin >> x >> y >> c ; if(c == 'D') { xx = find(fa[x][y]) ; yy = find(fa[x + 1][y]) ; } if(c == 'R') { xx = find(fa[x][y]) ; yy = find(fa[x][y + 1]) ; } if(xx.x == yy.x and xx.y == yy.y) { return cout << i << endl , 0 ; } else fa[xx.x][xx.y] = yy ; } return puts("draw") , 0 ; }
1347:【例4-8】格子遊戲