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

【題目描述】
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>
#define ll long long
#define inf 0x3f3f3f3f
#define PII pair<int,int>

using namespace std;
const int N=4e5+5;
int fa[N],n,m,x,y;
char c;

int Find(int x)
{
    if(fa[x]!=x)
        fa[x]=Find(fa[x]);
    return fa[x];
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> n >> m;
    for(int i=1;i<=n*n;i++)
        fa[i]=i;
    int flag=0;
    for(int i=1;i<=m;i++)
    {
        cin >> x >> y >> c;
        int z=(x-1)*n+y;
        int u=Find(z),v;
        if(c=='D')
            v=Find(x*n+y);
        else
            v=Find(z+1);
        if(u!=v)
            fa[u]=v;
        else
        {
            cout << i << endl,flag=1;
            break;
        }
    }
    if(!flag)
        cout << "draw" << endl;
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章