BFS最后一个点wa但应该不是数组开小的原因
查看原帖
BFS最后一个点wa但应该不是数组开小的原因
1110958
cyxypa楼主2024/7/21 13:54

我的思路是用bfs模拟,以时间t为维度进行遍历,给每一个地块赋值最早到达的时间。等t到了陨石砸下的时候就将毁坏的地块强行赋值-1。

最后一个点wa,数组开了1e3+5,而且取消了对边界的判断,应该不是数组开小的原因。 求大佬指点!

#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <string>
#include <algorithm>
#include <map>
#include <cstring>
using namespace std;
#define int long long
#define input(f) for(int i=1;i<=n;cin>>f[i++])
#define print(f) for(int i=0;i<n;cout<<f[i++]<<(i==n?'\n':' '))
const int INF=0x3f3f3f3f;
const int MAXN=1e3+5;
int f[MAXN][MAXN];
int go[][2]={{0,1},{1,0},{-1,0},{0,-1}};
struct cyx
{
	int x,y,t;
}lst[50000+5];
queue<pair<int,int>>q;
bool check(int x,int y)
{
	if (0<=x && 0<=y  && f[x][y]==0 && !(x==0 && y==0)) return true;
	return false;
}
void za(int x,int y)
{
	f[x][y]=-1;
	for (int i=0;i<4;i++) 
		if ( (x+go[i][0])>=0 && (y+go[i][1])>=0)
			f[x+go[i][0]][y+go[i][1]]=-1;
}
bool cmp(cyx a,cyx b){return a.t<b.t;}
signed main()
{
	int T,k=0,cnt=0,cnt1=1,cnt2=0;
	cin>>T;
	for (int i=0;i<T;i++)
		cin>>lst[i].x>>lst[i].y>>lst[i].t;
	sort(lst,lst+T,cmp);
	q.push(make_pair(0,0));
	f[0][0]=0;
	while (q.size()!=0)
	{
		while (lst[cnt].t==k && cnt<T)
		{
			za(lst[cnt].x,lst[cnt].y);
			cnt++;
		}
		int x=q.front().first,y=q.front().second;
		q.pop();
		cnt1--;
		for(int i=0;i<4;i++)
		{
			if (check(x+go[i][0],y+go[i][1]) && f[x][y]!=-1)
			{
				f[x+go[i][0]][y+go[i][1]]=k+1;
				q.push(make_pair(x+go[i][0],y+go[i][1]));
				cnt2++;
			}
		}
		if (cnt1==0)
		{
			cnt1=cnt2;
			cnt2=0;
			k++;
		}
	}
	while (lst[cnt].t>=k && cnt<T)
	{
		za(lst[cnt].x,lst[cnt].y);
		cnt++;
	}
	int ans=INF;
	for (int i=0;i<300;i++)
	{
		for (int j=0;j<300;j++)
		{
			if (f[i][j]==0 && !(i==0 && j==0)) continue;
			ans=(f[i][j]==-1?ans:min(ans,f[i][j]));
		}
	}
	cout<<((ans==INF||ans==0&&f[0][0]==-1)?-1:ans)<<endl;
	
	
	
}


2024/7/21 13:54
加载中...