格子游戏
思路:若能够形成自环,则两点在连线之前属于同一个集合。并查集裸题,不过需要把二维状态下坐标映射到一维,这里用一个cnt不断自增来映射,也可以将x,y从0开始a[x][y] = n*x+y
代码如下
#include<iostream>
using namespace std;
const int N = 210;
int n, m, cnt;
int p[N*N];
int a[N][N];
int find(int x){
if(p[x] != x) p[x] = find(p[x]);
return p[x];
}
int main(){
scanf("%d%d", &n, &m);
for(int i=1; i<=n*n; ++i) p[i] = i;
for(int i=1; i<=n; ++i)
for(int j=1; j<=n; ++j)
a[i][j] = ++cnt;
bool flag = false;
for(int i=1; i<=m; ++i){
int c, d;
char op[2];
scanf("%d%d%s", &c, &d, op);
int x, y;
if(*op == 'D'){
x = c+1, y = d;
}else {
x = c, y = d+1;
}
int px = find(a[c][d]), py = find(a[x][y]);
if(px == py){printf("%d\n", i); flag = true; break;}
p[px] = py;
}
if(!flag) puts("draw");
return 0;
}