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

传送门

题意

一个(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;
}
原文地址:https://www.cnblogs.com/hhyx/p/13424842.html