【网格图环判断】格子游戏
传送门
题意
一个\(n\times n\)的方格阵,两个人轮流画\(m\)条边,输入一个起始点,和一个指令,
\(D\)向下,\(R\)向右,如果出现封闭正方形,也就是环,输入第一个形成环的指令
数据范围
\(1\leq n \leq 200\)
\(1\leq m \leq 24000\)
题解
将二维网格图的坐标映射到一维:
- 下标\(0\)开始
- \(idx=x\times n+y\)
画出部分图形可以看出
当合并两个点前两个点就属于同一个集合,合并后加的一条边就将这个集合变成一个环
Code
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int fa[N],sz[N];
int n,m;
int find(int x){
if(fa[x]!=x) fa[x]=find(fa[x]);
return fa[x];
}
void merge(int a,int b){
fa[find(a)]=find(b);
}
int main(){
cin>>n>>m;
for(int i=1;i<=n*n;i++)
fa[i]=i;
for(int i=1;i<=m;i++){
int x,y;
char dir;
cin>>x>>y>>dir;
x--,y--;
int a=x*n+y;
if(dir=='D') x++;
else y++;
int b=x*n+y;
if(find(a)==find(b)){
cout<<i<<endl;
return 0;
}
merge(a,b);
}
cout<<"draw"<<endl;
}