标签:
Time Limit: 2000MS | Memory Limit: 30000K | |
Total Submissions: 8631 | Accepted: 2019 |
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 <stdlib.h> 4 #include <iostream> 5 #include <algorithm> 6 #include <queue> 7 using namespace std; 8 const int inf=0x3f3f3f3f; 9 struct node { 10 int x, y; 11 int ans; 12 } f1,f2; 13 int map[210][210][3]; 14 int vis[210][210]; 15 int jx[]= {0,0,1,-1}; 16 int jy[]= {1,-1,0,0}; 17 int min1; 18 void bfs(int s, int e) 19 { 20 int i, j; 21 queue<node>q; 22 f1.x=s; 23 f1.y=e; 24 f1.ans=0; 25 vis[s][e]=1; 26 q.push(f1); 27 min1=inf; 28 while(!q.empty()) { 29 f1=q.front(); 30 q.pop(); 31 if(f1.x<=0||f1.x>=199||f1.y<=0||f1.y>=199) {//边界处理,但是不能跳出,只能跳过,因为存在多个门的情况 32 min1=min(min1,f1.ans); //走出去之后,保存最小通过门数 33 continue ; 34 } 35 for(i=0; i<4; i++) { 36 f2.x=f1.x+jx[i]; 37 f2.y=f1.y+jy[i]; 38 if(i==0) {//向上走 39 if(!vis[f2.x][f2.y]&&map[f1.x][f1.y][0]!=2) { 40 if(map[f1.x][f1.y][0]==1) 41 f2.ans=f1.ans+1; 42 else 43 f2.ans=f1.ans; 44 vis[f2.x][f2.y]=1; 45 q.push(f2); 46 } 47 } else if(i==1) {//向下走 48 if(!vis[f2.x][f2.y]&&map[f2.x][f2.y][0]!=2) { 49 if(map[f2.x][f2.y][0]==1) 50 f2.ans=f1.ans+1; 51 else 52 f2.ans=f1.ans; 53 vis[f2.x][f2.y]=1; 54 q.push(f2); 55 } 56 } else if(i==2) {//向右走 57 if(!vis[f2.x][f2.y]&&map[f1.x][f1.y][1]!=2) { 58 if(map[f1.x][f1.y][1]==1) 59 f2.ans=f1.ans+1; 60 else 61 f2.ans=f1.ans; 62 vis[f2.x][f2.y]=1; 63 q.push(f2); 64 } 65 } else if(i==3) {//向左走 66 if(!vis[f2.x][f2.y]&&map[f2.x][f2.y][1]!=2) { 67 if(map[f2.x][f2.y][1]==1) 68 f2.ans=f1.ans+1; 69 else 70 f2.ans=f1.ans; 71 vis[f2.x][f2.y]=1; 72 q.push(f2); 73 } 74 } 75 } 76 } 77 } 78 int main() 79 { 80 int n, m, i, j; 81 int x,y,d,t; 82 double a1,a2; 83 int int_x,int_y; 84 while(scanf("%d %d",&m,&n)!=EOF) { 85 if(n==-1&&m==-1) break; 86 memset(map,0,sizeof(map)); 87 memset(vis,0,sizeof(vis)); 88 for(i=0; i<m; i++) { 89 scanf("%d %d %d %d",&x, &y, &d, &t); 90 if(d) { 91 for(j=0; j<t; j++) { 92 map[x-1][y+j][1]=2; 93 } 94 } else { 95 for(j=0; j<t; j++) { 96 map[x+j][y-1][0]=2; 97 } 98 } 99 } 100 for(i=0; i<n; i++) { 101 scanf("%d %d %d",&x,&y,&d); 102 if(d) { 103 map[x-1][y][1]=1; 104 } else { 105 map[x][y-1][0]=1; 106 } 107 } 108 scanf("%lf %lf",&a1,&a2); 109 int_x=a1; 110 int_y=a2; 111 if(int_x<=0||int_x>=199||int_y<=0||int_y>=199) {//后台可能出现 0,0 200+,200+,虽然不符合题目描述 112 printf("0\n"); 113 continue ; 114 } 115 bfs(int_x,int_y); 116 if(min1==inf) 117 printf("-1\n"); 118 else 119 printf("%d\n",min1); 120 } 121 return 0; 122 }
标签:
原文地址:http://www.cnblogs.com/glchen/p/5452693.html