AcWing 1250. 格子游戏
原题链接
简单
作者:
Value
,
2020-06-25 12:57:23
,
所有人可见
,
阅读 683
/*
对于映射:选择将二维映射成一维,
可以让x--,y--然后映射到0开始的一维下标
也可以不做处理,但是这个时候需要将parent数组开的大一些,否则会报SF或者Wrong
*/
#include <iostream>
using namespace std;
const int N = 50210; // 对于极端情况200 * 200的情况,0-200的地址没有用到
int parent[N];
int find(int t){
if(parent[t] == t) return t;
return parent[t] = find(parent[t]);
}
int main(){
int n, m; cin >> n >> m;
for(int i = 0; i < N; i ++ ) parent[i] = i;
int x, y; char op[5];
bool flag = false;
for(int i = 1; i <= m; i ++ ){
cin >> x >> y >> op;
int start = x * n + y, ed;
if(op[0] == 'D') ed = (x + 1) * n + y;
else ed = x * n + y + 1;
int pa = find(start), pb = find(ed);
if(pa == pb){
cout << i << endl;
flag = true;
break;
}
parent[pa] = pb;
}
if(!flag) cout << "draw" << endl;
return 0;
}
大佬 for(int i = 0; i < N; i ++ ) parent[i] = i;这里初始化为啥要从0-n啊
这个题目使用的数据结构是并查集,一开始每一个都是一个独立的单元,也就是自己的祖先就是自己!