Time Limit: 2000MS | Memory Limit: 30000K | |
Total Submissions: 6988 | Accepted: 1600 |
Description
Input
Output
Sample Input
8 9 1 1 1 3 2 1 1 3 3 1 1 3 4 1 1 3 1 1 0 3 1 2 0 3 1 3 0 3 1 4 0 3 2 1 1 2 2 1 2 3 1 3 1 1 3 2 1 3 3 1 1 2 0 3 3 0 4 3 1 1.5 1.5 4 0 1 1 0 1 1 1 1 1 2 1 1 1 1 2 0 1 1.5 1.7 -1 -1
Sample Output
5 -1
1 #include<stdio.h> 2 #include<string.h> 3 #include<queue> 4 using namespace std; 5 6 int n,m,ex,ey; 7 int map[410][410],vis[410][410]; 8 struct node 9 { 10 int x,y; 11 int step; 12 bool operator<(struct node b)const 13 { 14 return step > b.step;//按步数从小到大排序,每次取队列中步数较小的; 15 } 16 }; 17 priority_queue <struct node> que; 18 19 int bfs() 20 { 21 while(!que.empty()) 22 que.pop(); 23 que.push((struct node){1,1,0});//从终点到起点 24 vis[1][1] = 1; 25 while(!que.empty()) 26 { 27 struct node u = que.top(); 28 que.pop(); 29 if(u.x == ex && u.y == ey) 30 return u.step; 31 if(map[u.x-1][u.y] != 1 && !vis[u.x-1][u.y]) 32 { 33 vis[u.x-1][u.y] = 1; 34 if(map[u.x-1][u.y] == 0) 35 que.push((struct node){u.x-1,u.y,u.step}); 36 else que.push((struct node){u.x-1,u.y,u.step+1}); 37 } 38 if(map[u.x+1][u.y] != 1 && !vis[u.x+1][u.y]) 39 { 40 vis[u.x+1][u.y] = 1; 41 if(map[u.x+1][u.y] == 0) 42 que.push((struct node){u.x+1,u.y,u.step}); 43 else que.push((struct node){u.x+1,u.y,u.step+1}); 44 } 45 if(map[u.x][u.y-1] != 1 && !vis[u.x][u.y-1]) 46 { 47 vis[u.x][u.y-1] = 1; 48 if(map[u.x][u.y-1] == 0) 49 que.push((struct node){u.x,u.y-1,u.step}); 50 else que.push((struct node){u.x,u.y-1,u.step+1}); 51 } 52 if(map[u.x][u.y+1] != 1 && !vis[u.x][u.y+1]) 53 { 54 vis[u.x][u.y+1] = 1; 55 if(map[u.x][u.y+1] == 0) 56 que.push((struct node){u.x,u.y+1,u.step}); 57 else que.push((struct node){u.x,u.y+1,u.step+1}); 58 } 59 } 60 return -1; 61 } 62 int main() 63 { 64 int x,y,d,t; 65 while(~scanf("%d %d",&n,&m)) 66 { 67 int i; 68 if(n == -1 && m == -1) 69 break; 70 //1表示墙,2表示门,3表示空气 71 memset(map,0,sizeof(map)); 72 memset(vis,0,sizeof(vis)); 73 while(n--) 74 { 75 scanf("%d %d %d %d",&x,&y,&d,&t); 76 if(d == 1) 77 { 78 for(i = y*2; i <= (y+t)*2; i++) 79 map[x*2][i] = 1; 80 } 81 else 82 { 83 for(i = x*2; i <= (x+t)*2; i++) 84 map[i][y*2] = 1; 85 } 86 } 87 while(m--) 88 { 89 scanf("%d %d %d",&x,&y,&d); 90 if(d == 1) 91 map[x*2][y*2+1] = 2; 92 else 93 map[x*2+1][y*2] = 2; 94 } 95 double e_x,e_y; 96 scanf("%lf %lf",&e_x,&e_y); 97 if(e_x < 0 || e_y < 0 || e_x > 199 || e_y > 199) 98 { 99 printf("0\n"); 100 continue; 101 } 102 ex = (int)e_x*2+1; 103 ey = (int)e_y*2+1; 104 for(i = 0; i <= 400; i++) 105 map[i][0] = map[0][i] = map[400][i] = map[i][400] = 1; 106 printf("%d\n",bfs()); 107 } 108 return 0; 109 }