格子游戏
格子游戏
【问题描述】
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
1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 int n,m; 5 char c; 6 int a,b; 7 struct node 8 { 9 int x,y; 10 }far[500][500],k1,k2; 11 node find(node k) 12 { 13 if((far[k.x][k.y].x==k.x)&&(far[k.x][k.y].y==k.y))return k; 14 far[k.x][k.y]=find(far[k.x][k.y]); 15 return far[k.x][k.y]; 16 } 17 int main() 18 { 19 freopen("game.in","r",stdin); 20 freopen("game.out","w",stdout); 21 scanf("%d%d",&n,&m); 22 for(int i=1;i<=n;++i) 23 for(int j=1;j<=n;++j) 24 { 25 far[i][j].x=i;far[i][j].y=j; 26 } 27 for(int i=1;i<=m;++i) 28 { 29 cin>>a>>b>>c; 30 if(c=='D') 31 { 32 k1=find(far[a][b]); 33 k2=find(far[a+1][b]); 34 } 35 if(c=='R') 36 { 37 k1=find(far[a][b]); 38 k2=find(far[a][b+1]); 39 } 40 if(k1.x==k2.x&&k1.y==k2.y) 41 { 42 printf("%d\n",i);return 0; 43 } 44 else far[k1.x][k1.y]=k2; 45 } 46 printf("draw"); 47 return 0; 48 }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
· 现代计算机视觉入门之:什么是视频
· Sdcb Chats 技术博客:数据库 ID 选型的曲折之路 - 从 Guid 到自增 ID,再到
· .NET Core GC压缩(compact_phase)底层原理浅谈
· Winform-耗时操作导致界面渲染滞后
· Phi小模型开发教程:C#使用本地模型Phi视觉模型分析图像,实现图片分类、搜索等功能
· 语音处理 开源项目 EchoSharp