题目
Alice和Bob玩了一个古老的游戏:首先画一个n × n的点阵(下图n = 3)

接着,他们两个轮流在相邻的点之间画上红边和蓝边:
直到围成一个封闭的圈(面积不必为1)为止,“封圈”的那个人就是赢家。因为棋盘实在是太大了(
n
≤
200
n ≤ 200
n≤200),他们的游戏实在是太长了!他们甚至在游戏中都不知道谁赢得了游戏。于是请你写一个程序,帮助他们计算他们是否结束了游戏?
分析
求一个时刻正好成为一个圈,使用并查集。
代码
#include <cstdio>
#include <cctype>
using namespace std;
struct node{
int x,y;
}f[202][202],k1,k2; int n,m;
int in(){
int ans=0; char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=ans*10+c-48,c=getchar();
return ans;
}
node getf(node k){return (f[k.x][k.y].x==k.x&&f[k.x][k.y].y==k.y)?k:f[k.x][k.y]=getf(f[k.x][k.y]);}
int main(){
n=in(); m=in();
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++) f[i][j].x=i,f[i][j].y=j;
for (int i=1;i<=m;i++){
int u,v; u=in(); v=in();
char w=getchar();
if (w=='D') k1=getf(f[u][v]),k2=getf(f[u+1][v]);
else k1=getf(f[u][v]),k2=getf(f[u][v+1]);
if (k1.x!=k2.x||k1.y!=k2.y) f[k1.x][k1.y]=f[k2.x][k2.y];//不成圈
else {printf("%d",i); return 0;}
}
puts("draw"); return 0;
}
本文介绍了一款两人交替进行的游戏,通过在点阵中绘制不同颜色的边来形成封闭区域,最后完成封闭者获胜。文章提供了一个利用并查集算法判断游戏结束情况的程序实现。

被折叠的 条评论
为什么被折叠?



