1. 程式人生 > >1347:【例4-8】格子遊戲

1347:【例4-8】格子遊戲

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】格子遊戲