思路:并查集简单应用,虽然是二维点阵但原理上是简单的并查集,要想清楚成环的条件:本次操作需要连接的两点已经在同一个集合中。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 210, M = 24010;
typedef struct
{
int x, y;
}P;
int n, m;
P p[N][N];
P find(P k)
{
if(p[k.x][k.y].x == k.x && p[k.x][k.y].y == k.y) return k;
return p[k.x][k.y] = find(p[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++)
{
p[i][j].x = i;
p[i][j].y = j;
}
}
int flag = 0;
for(int i = 1;i <= m; i++)
{
int x, y;
char op[2];
scanf("%d%d%s", &x, &y, op);
if(flag) continue;
P r = find(p[x][y]);
P k;
if(op[0] == 'D') k = find(p[x + 1][y]);
else k = find(p[x][y + 1]);
if(r.x == k.x && r.y == k.y) flag = i;
else p[k.x][k.y] = r;
}
if(flag) printf("%d\n", flag);
else puts("draw");
return 0;
}