【一本通1347】格子游戏

(尽管可能各位大佬觉得很简单,但对于讲课时真的没看懂这个代码的蒟蒻,真的要写一写)

这个题是一个神奇的二维的并查集,然而二维的真的好乱,弄得我搞不懂qwq

jiuzhe代码食用吧emm

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int n,m,x,y;
char a;
struct hyh{//首先定义了一个结构体,里面存横纵坐标
    int x,y;
}f[201][201],k1,k2;
hyh find(hyh sy){//也是“找父亲”,只不过变成了二维
    if(f[sy.x][sy.y].x==sy.x&&f[sy.x][sy.y].y==sy.y)return sy;//如果他自己的父亲是自己,返回
    f[sy.x][sy.y]=find(f[sy.x][sy.y]);
    return f[sy.x][sy.y];
}
void unionn(hyh a,hyh b){
    f[b.x][b.y]=a;//合并
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
      for(int j=1;j<=n;j++){
          f[i][j].x=i;
          f[i][j].y=j;
      }
    for(int i=1;i<=m;i++){
        cin>>x>>y>>a;
        if(a=='D'){
            k1=find(f[x][y]);
            k2=find(f[x+1][y]);
        }
        if(a=='R'){
            k1=find(f[x][y]);
            k2=find(f[x][y+1]);
        }
        if((k1.x==k2.x)&&(k1.y==k2.y)){
            cout<<i<<endl;
            return 0;
        }
        if((k1.x!=k2.x)||(k1.y!=k2.y))
            unionn(k1,k2);
    }
    cout<<"draw"<<endl;
    return 0;
}

 

posted @ 2019-04-26 19:10  Sweetness  阅读(346)  评论(0编辑  收藏  举报