思路:
把图标记后有条件的bfs
#include <stdio.h>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int inf=0x3f3f3f3f;
int mp[405][405];
int vis[405][405];
int n,m;
int data[4][2]={0,1,0,-1,1,0,-1,0};
struct node
{
int x,y,t;
node(int _x,int _y,int _t)
{
x=_x,y=_y,t=_t;
}
};
void bfs()
{
int ans=0x3f3f3f3f;
queue<node>q;
node f(0,0,0);
q.push(f);
while(!q.empty())
{
f=q.front();
q.pop();
if(vis[f.x][f.y])continue;
vis[f.x][f.y]=1;
if(mp[f.x][f.y]==inf)
{
ans=f.t;
break;
}
for(int i=0;i<4;i++)
{
node s=f;
s.x+=data[i][0],s.y+=data[i][1];
s.t+=1;
if(s.x>n||s.y>n||s.y<0||s.x<0||mp[s.x][s.y]<=s.t)
continue;
q.push(s);
}
}
if(ans==inf)
printf("-1\n");
else
printf("%d\n",ans);
}
int main()
{
n=400;
for(int i=0;i<=n;i++)
{
for(int j=0;j<=n;j++)
mp[i][j]=inf;
}
int x,y,t;
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&t);
if(mp[x][y]>t)
mp[x][y]=t;
for(int j=0;j<4;j++)
{
int dx=x+data[j][0],dy=y+data[j][1];
if(dx>n||dy>n||dy<0||dx<0||mp[dx][dy]<=t)
continue;
mp[dx][dy]=t;
}
}
bfs();
}