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; }