返回顶部

格子游戏

作者:@suiran20090524
本文为作者原创,转载请注明出处:https://www.cnblogs.com/suiran20090524/p/16516164.html


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;
}


如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
posted @   眭然  阅读(37)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示