开始的时候犯了一个错误:重复搜索,所以一直超时(32行中漏写了d[nx][ny]==0)

之后又发现50行错写成了:maze[x][y]=t;   

改正之后就AC了,卡了我很久,我太难了!!!

 1 #include<cstring>
 2 #include<iostream>
 3 #include<queue>
 4 #include<algorithm>
 5 #include<cstdio>
 6
 7 using namespace std;
 8
 9 typedef pair<int,int> P;
10 const int INF=100000000;
11 int m;
12 int maze[800][800];
13 int x,y;
14 int t;
15 int d[800][800];
16 int dx[4]={1,-1,0,0};
17 int dy[4]={0,0,-1,1};
18
19 void bfs(){
20     queue<P> que;
21     que.push(P(0,0));
22     while(que.size()){
23         x=que.front().first;
24         y=que.front().second;
25         que.pop();
26         if(maze[x][y]==INF){
27             printf("%d\n",d[x][y]); return;
28         }
29         for(int i=0;i<4;i++){
30             int nx=x+dx[i],ny=y+dy[i];
31             if(nx==0&&ny==0) continue;
32             if(0<=nx&&ny>=0&&d[nx][ny]==0&&(d[x][y]+1<maze[nx][ny])){
33                 d[nx][ny]=d[x][y]+1;
34                 que.push(P(nx,ny));
35             }
36         }
37     }
38     printf("-1\n");
39 }
40
41 void solve(){
42     for(int i=0;i<800;i++){
43         for(int j=0;j<800;j++)
44             maze[i][j]=INF;
45     }
46     scanf("%d",&m);
47     for(int i=1;i<=m;i++){
48         scanf("%d%d%d",&x,&y,&t);
49
50         maze[x][y]=min(maze[x][y],t);
51         for(int j=0;j<4;j++){
52             int nx=x+dx[j],ny=y+dy[j];
53             if(0<=nx&&ny>=0){
54                 maze[nx][ny]=min(maze[nx][ny],t);
55             }
56         }
57     }
58     bfs();
59 }
60
61 int main(){
62     solve();
63     return 0;
64 }
12-28 21:50