题目:
题解:
如果两个点出现在一个集合中则说明出现了环游戏结束。
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=40001;
int p[N];
int n,m;
int find(int x){
if(x!=p[x])return p[x]=find(p[x]);
return p[x];
}
//将二维坐标映射到一维并查集点上
int get(int x,int y){
return x*n+y;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=0;i<n*n;i++)p[i]=i;
int ans=0;
for(int i=0;i<m;i++){
int a,b;
char c;
scanf("%d%d",&a,&b);
scanf(" %c",&c);
//从x,y的下标都从0开始
--a,--b;
int x=get(a,b),y;
if(c=='D')y=get(a+1,b);
else y=get(a,b+1);
int px=find(x),py=find(y);
if(px==py){
ans=i+1;
break;
}
p[px]=py;
}
if(ans)printf("%d",ans);
else printf("draw");
return 0;
}
题后反思:
x , y都从0开始的二维坐标可以通过x*m+y映射到一维。