标签:游戏 格子 get int 样例 pb pa find
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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。