20分求助
  • 板块P3395 路障
  • 楼主冰糖鸽子「僕は…」
  • 当前回复5
  • 已保存回复5
  • 发布时间2020/10/3 20:03
  • 上次更新2023/11/5 12:07:17
查看原帖
20分求助
227728
冰糖鸽子「僕は…」楼主2020/10/3 20:03

只对了1,其他都WA

预处理每个格子什么时候之前是安全的,然后搜索里加入t记录时间

代码:

#include <bits/stdc++.h>
using namespace std;
int T,n,f[2000][2000],v[2000][2000],a,b;
bool flag;
int X[5] = {0,1,0,-1},Y[5] = {1,0,-1,0};
bool iscon(int a,int b)
{
	if(a>=0&&a<n&&b>=0&&b<n)
	{
		return 1;
	}
	return 0;
}
void dfs(int x,int y,int t)
{
	if(flag){return;}
	if(v[x][y])
	{
		return ;
	}
	if(x == n-1 && y == n-1)
	{
		cout << "Yes" << endl;
		flag = 1;
		return ;
	}
	v[x][y]=1;
	for(int i = 0;i < 4;i++)
	{
		if(iscon(x+X[i],y+Y[i])&&(f[x+X[i]][y+Y[i]]==0 || f[x+X[i]][y+Y[i]]>t))
		{
			dfs(x+X[i],y+Y[i],t+1);
		}
	}
}
int main()
{
	cin >> T;
	for(int kkk = 0;kkk < T;kkk++)
	{
		cin >> n;
		for(int i = 0;i < 1500;i++)
		{
			for(int j = 0;j < 1500;j++)
			{
				f[i][j]=0;
				v[i][j]=0;
			}
		}
		for(int i = 0;i < 2*n-2;i++)
		{
			cin >> a >> b;
			a--;
			b--;
			f[a][b] = i+1;
		}
		flag = 0;
		dfs(0,0,0);
		if(!flag)
		{
			cout << "No" << endl;
		}
	}
	return 0;
}
2020/10/3 20:03
加载中...