35分求调!!!
查看原帖
35分求调!!!
1411846
zhangkerui2012楼主2025/7/25 09:09

我非常无语,这道题也太难了!!!!

事情是这样的,本蒟蒻想水一道简简单单的黄题,本蒟蒻努力写了一百来行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;
}
2025/7/25 09:09
加载中...