【网格图环判断】格子游戏

传送门

题意

一个\(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;
}
posted @ 2020-08-03 10:20  Hyx'  阅读(206)  评论(0编辑  收藏  举报