格子游戏

格子游戏
【问题描述】
  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 }
复制代码

 

posted @   MJT12044  阅读(238)  评论(0编辑  收藏  举报
编辑推荐:
· .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
点击右上角即可分享
微信分享提示