格子游戏
作者:@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;
}
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】