正题
题目链接
大意
有两个人在玩游戏,在一个n*n的矩阵的点上画线,有如果有线封了圈那么游戏结束,给出一些操作,求在那一轮结束了游戏,或没有结束游戏。
解题思路
用并查集把点相连,直到并查集形成环为止
代码
#include<cstdio>
#include<iostream>
using namespace std;
int n,m,x,y,father[40001],s;
char c;
int find(int x)
{if (x!=father[x]) return father[x]=find(father[x]);return father[x];
}//并查集寻找
bool unionn(int x,int y)
{int fa=find(x),fb=find(y);father[fa]=fb;
}//连接
int point(int x,int y)
{return (x-1)*n+y;
}//返回对应坐标的编号
int main()
{scanf("%d%d",&n,&m);for (int i=1;i<=n*n;i++) father[i]=i;//初始化for (int i=1;i<=m;i++){scanf("%d%d",&x,&y);cin>>c;if (c=='R'){if (find(point(x,y))==find(point(x,y+1))) //如果形成环{printf("%d",i);return 0;}unionn(point(x,y),point(x,y+1));//连接}if (c=='D'){if (find(point(x,y))==find(point(x+1,y))) {printf("%d",i);return 0;}unionn(point(x,y),point(x+1,y));}}printf("draw");//没有结束游戏
}