并查集 1347:【例4-8】格子游戏
1347:【例4-8】格子游戏
并查集的二维升级版(简称寻找二维爹自己起的)
也就是他们自己变成了二维坐标,父结点自然也要变成二维啦
代码:
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> using namespace std; int n,m,a,b; char c; struct node { int x,y; //横纵坐标 }father[10001][10001],k1,k2; node find(node k) //开始找父亲 { if(father[k.x][k.y].x!=k.x&&father[k.x][k.y].y!=k.y) father[k.x][k.y]=find(father[k.x][k.y]); return father[k.x][k.y]; } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) //初始化 { father[i][j].x=i; father[i][j].y=j; } for(int i=1;i<=m;i++) { scanf("%d%d%s",&a,&b,&c); if(c=='D') //向下走 { k1=find(father[a][b]); k2=find(father[a+1][b]); } if(c=='R') //向右走 { k1=find(father[a][b]); k2=find(father[a][b+1]); }
if(k1.x==k2.x&&k1.y==k2.y) //判断是否连通结束 { cout<<i<<endl; return 0; } else father[k1.x][k1.y]=k2; //否则合并 } cout<<"draw"; //一直未结束 return 0; }