其他分享
首页 > 其他分享> > 格子游戏

格子游戏

作者:互联网

Alice和Bob玩了一个古老的游戏:首先画一个n*n的点阵(图4-22中n=3)
接着,他们两个轮流在相邻的点之间画上虚边和粗边:
直到围成一个封闭的圈(面积不必为1)为止,“封圈”的那个人就是赢家。因为棋盘实在是太大了(n<=200),他们的游戏实在是太长了!他们甚至在游戏中都不知道谁赢得了游戏。于是请你写一个程序,帮助他们计算他们是否结束了游戏?

输入

第一行为两个整数n和m。m表示一共画了m条线,每条线长度为1.
以后m行,每行首先由两个数字(x,y),代表了画线的起点坐标,接着用空格隔开一个字符,加入字符是“D”,则是向下连一条边,如果是“R”就是向右连一条边,长度为1。输入数据不会有重复的边且保证正确。

输出

输出一行:

在第几步的时候结束。假如m步之后也没有结束,则输出一行“draw”。

样例

样例输入1

3 5
1 1 D
1 1 R
1 2 D
2 1 R
2 2 D

样例输出1

4
#include <bits/stdc++.h>
using namespace std;
const int N=41000;
int p[N],n,m;
int get(int x,int y) {
    return(x-1)*n+y-1;
}
int find(int x) {
    if(x!=p[x])
		p[x]=find(p[x]);
    return p[x];
}
int main(){
    cin>>n>>m;
    for (int i=0;i<=n*n;i++)
		p[i]=i;
    int res=-1;
    for (int i=1;i<=m;i++) {
        int x,y;
        char ch;
        cin>>x>>y>>ch;
        int a,b;
		a=get(x,y),b=(ch=='D')?get(x+1,y):get(x,y+1);
        int pa=find(a),pb=find(b);
        if(pa==pb){
            res=i;
            break;
        }
        else{
            p[pa]=pb;
        }
    }
    if(res!=-1)cout<<res;
    else puts("draw");
    return 0;
}

标签:游戏,格子,get,int,样例,pb,pa,find
来源: https://www.cnblogs.com/suiran20090524/p/16516164.html