事情是这样的,本蒟蒻想水一道简简单单的黄题,本蒟蒻努力写了一百来行dfs,花了一个多小时,却发现竟然只有35分。。。
看在蒟蒻这么可怜的份上,dalao能不能邦芒看看dfs代码咋么过啊
#include<iostream>
#include<vector>
#include<algorithm>
#define int long long
using namespace std;
const int N=3010;
const int M=5e4+10;
int n,s=1e18;
struct in{
int x;
int y;
int t;
int x1,y1,x2,y2,x3,y3,x4,y4;
}a[M];
bool f[N][N],p[N][N];
int dx[5]={0,1,-1,0,0};
int dy[5]={0,0,0,1,-1};
namespace zhang{
inline int read()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int x;cin>>x;return x;
}
inline void print(int x)
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cout<<x<<'\n';return;
}
inline bool cmp(in a1,in a2){return a1.t<a2.t;}
inline bool flag(int p,int i,int j,int t)
{
p--;
while(t==a[++p].t)
if(
((i==a[p].x1||i==a[p].x2)&&j==a[p].y1)
|| ((j==a[p].y3||j==a[p].y4)&&i==a[p].x3)
|| (i==a[p].x&&j==a[p].y))return 1;
return 0;
}
inline void dfs(int x,int y,int t,int l)
{
if(x<0||y<0)return;
if(t==a[l].t&&flag(l,x,y,t))return;
if(f[x][y])return;
if(t>s)return;
if(!p[x][y])
{
s=t;
//cout<<x<<" "<<y<<" "<<t<<'\n';
return;
}
int s1=0;
while(t==a[l].t)
{
f[a[l].x][a[l].y]=1;
f[a[l].x1][a[l].y1]=1;
f[a[l].x2][a[l].y2]=1;
f[a[l].x3][a[l].y3]=1;
f[a[l].x4][a[l].y4]=1;
l++;
s1++;
}
f[x][y]=1;
for(int i=1;i<=4;i++)
{
dfs(x+dx[i],y+dy[i],t+1,l);
}
f[x][y]=0;
while(s1--)
{
l--;
f[a[l].x][a[l].y]=0;
f[a[l].x1][a[l].y1]=0;
f[a[l].x2][a[l].y2]=0;
f[a[l].x3][a[l].y3]=0;
f[a[l].x4][a[l].y4]=0;
}
return;
}
}using namespace zhang;
signed main()
{
int i,j;
n=read();
for(i=1;i<=n;i++)
{
a[i].x=read();
a[i].y=read();
a[i].t=read();
a[i].x1=a[i].x+1;
a[i].x2=a[i].x-1;
a[i].y1=a[i].y2=a[i].y;
a[i].y3=a[i].y-1;
a[i].y4=a[i].y+1;
a[i].x3=a[i].x4=a[i].x;
p[a[i].x][a[i].y]=1;
p[a[i].x+1][a[i].y]=1;
if(a[i].x-1>=0)p[a[i].x-1][a[i].y]=1;
p[a[i].x][a[i].y+1]=1;
if(a[i].y-1>=0)p[a[i].x][a[i].y-1]=1;
}
// cout<<'\n';
stable_sort(a+1,a+n+1,cmp);
dfs(0,0,0,1);
if(s==1e18)print((int)-1);
else print(s);
return 0;
}