传送门:格子游戏
思路:将图上的每一个点都用他们的坐标转化成一个具体的数字表示做一个点,如 (x,y)可以表示成a= x*n+y。每次向右和向下扩展的时候就相当于将两个点所在的并查集树合并,在合并之前要判断他们的根节点是否相同,如果相同的话就说明已经出现环了。
如果在某一步就直接的跳出循环,那剩下的那些没输入的数据有什么用吗?
代码:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
typedef long long ll;
const int N=4e4+10;
int n,m;
int f[N];
int get(int x)
{
if(x!=f[x])
f[x]=get(f[x]);
return f[x];
}
int get1(int x,int y)
{
return x*n+y;
}
int main()
{
cin>>n>>m;
for(int i=0;i<=n*n;i++)
f[i]=i;
int x,y;
char c;
int res=0;
for(int i=1;i<=m;i++)
{
cin>>x>>y>>c;
x--;
y--;
int a=get1(x,y);
int b;
if(c=='D')
b=get1(x+1,y);
else
b=get1(x,y+1);
int pa=get(a);
int pb=get(b);
if(pa==pb)
{
res=i;
break;
}
f[pa]=pb;
}
if(!res) puts("draw");
else
cout<<res<<endl;
return 0;
}