格子游戏
思路:首先围成一个闭环的时候,两个点一定有边相连,那么可以把这两个点通过并查集连在一个连通块里面,如果两个点的父亲相同,那么就形成闭环。同时,为了方便可以将二维的图转化成一维的进行计算,k=x*n+y,x,y要从0开始统计。
代码附上:
#include <bits/stdc++.h>
using namespace std;
const int N =1e5+5;
int n,m;
int pre[N];
int root(int x){
return pre[x]=(pre[x]==x)?x:root(pre[x]);
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n>>m;
for(int i=0;i<=n*n;i++)pre[i]=i;
int ans=0;
bool flag = true;
while(m--){
ans++;
char dir;
int x,y;cin>>x>>y>>dir;
x--,y--;
int k=x*n+y;
if(dir=='D'){
int p=(x+1)*n+y;
int fx=root(k);
int fy=root(p);
if(fx!=fy){
pre[fx]=fy;
}
else{
flag = false;
break;
}
}
else {
int p=x*n+y+1;
int fx=root(k);
int fy=root(p);
if(fx!=fy){
pre[fx]=fy;
}
else {
flag = false;
break;
}
}
}
if(flag)cout<<"draw"<<"\n";
else cout<<ans<<"\n";
return 0;
}
标签:pre,int,fy,查集,fx,flag,plus,数据结构,root
From: https://blog.csdn.net/2302_81761369/article/details/137502832