BFS。
这题是个坑。很久没刷题了,偏偏又遇上这个坑题。下面是坑点:
数据范围是400 400,而不是题目所写的300 300,否则会WA。坑不?我WA了3次才发现。
由于输入巨大,一定要用scanf,而不能用cin,否则会超时。这个是我忘了,不能算题目坑。
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
#define MAX_X 400
#define MAX_Y 400
int a[MAX_X+1][MAX_Y+1];
bool vi[MAX_X+1][MAX_Y+1];
struct Pos{
int x;
int y;
int t;
};
Pos v[4]={{0,1},{0,-1},{1,0},{-1,0}};
queue<Pos> qe;
bool canMove(int x, int y, int t)
{
if(!(x<0||y<0||x>MAX_X||y>MAX_Y)&&(t<a[x][y]||a[x][y]==-1))
{
return true;
}
return false;
}
bool isSafe(Pos& pos)
{
int x=pos.x, y=pos.y, t=pos.t;
if(!(x<0||y<0||x>MAX_X||y>MAX_X)&&a[x][y]==-1)
return true;
return false;
}
bool fuck()
{
Pos start={0,0,0};
if(isSafe(start))
{
printf("%d\n",start.t);
return true;
}
qe.push(start);
vi[0][0]=true;
int t=0;
while(!qe.empty())
{
//
Pos p=qe.front();
int time=p.t;
qe.pop();
++time;
for(int i=0;i<4;i++)
{
int xx=p.x+v[i].x,yy=p.y+v[i].y;
if(canMove(xx,yy,time)&&vi[xx][yy]==false)
{
Pos pTmp={xx,yy,time};
if(isSafe(pTmp))
{
printf("%d\n",pTmp.t);
return true;
}
qe.push(pTmp);
vi[xx][yy]=true;
}
}
}
return false;
}
void init(int x, int y)
{
if(x==MAX_X&&y==MAX_Y){
memset(a,-1,sizeof(a));
memset(vi,false,sizeof(vi));
}
else{
for(int i=0;i<=x;i++)
for (int j=0;j<=y;j++)
{
a[i][j]=-1;
vi[i][j]=false;
}
}
}
void clearQ()
{
while(!qe.empty())
{
qe.pop();
}
}
int main()
{
int m,n;
init(MAX_X,MAX_Y);
while(scanf("%d",&m)!=EOF)
{
int x=0,y=0;
for(int i=0;i<m;i++)
{
int j,k,tt;
scanf("%d%d%d",&j,&k,&tt);
if(a[j][k]>tt||a[j][k]==-1)
a[j][k]=tt;
if(j>x)
x=j;
if(k>y)
y=k;
for(int p=0;p<4;p++)
{
int xx=j+v[p].x, yy=k+v[p].y;
if(!(xx<0||yy<0||xx>MAX_X||yy>MAX_Y)){
int t=a[xx][yy];
if(t==-1||t>tt)
a[xx][yy]=tt;
}
}
}
if(fuck()==false)
printf("-1\n");
clearQ();
init(x,y);
}
return 0;
}