传送门
题意
一个(n imes n)的方格阵,两个人轮流画(m)条边,输入一个起始点,和一个指令,
(D)向下,(R)向右,如果出现封闭正方形,也就是环,输入第一个形成环的指令
数据范围
(1leq n leq 200)
(1leq m leq 24000)
题解
将二维网格图的坐标映射到一维:
- 下标(0)开始
- (idx=x imes 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;
}