并查集模板题:
1.二维坐标转为一维坐标
2.在同一个集合的点,再加入一条边时就会联通。
3.并查集更比较适合一维上操作
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 4e4 + 10;
int n,m;
int p[N];
int fi(int x){//状态压缩
if(p[x] != x) p[x] = fi(p[x]);
return p[x];
}
/*因并查集在一维中更容易操作*/
int get(int x, int y){//将二维坐标转为1维
return x * n + y;
}
int main(){
cin >> n >> m;
for(int i = 0; i < n*n; i++) p[i] = i;
int res = 0;//记录答案
for(int i = 1; i <= m; i++){
int x,y;
char d;
cin >> x >> y >> d;
x--,y--; /*因x,y坐标从1开始,所以要--*/
int a = get(x,y);//起点a
int b;
if(d == 'D'){
b = get(x + 1,y);//向下走,另一个点为b;
}
if(d == 'R'){
b = get(x, y + 1);//向右走,另一个点为b.
}
int pa = fi(a);
int pb = fi(b);
if(pa == pb){//如果ab已经在一个集合中了,再加上一条边就联通了
res = i;
break;
}
p[pa] = pb;//如果两个点不在一个集合中,就将他们合并。
}
if(!res){//如果res还是为0,说明没有结束
puts("draw");
}
else{
cout << res << endl;
}
return 0;
}