标签:
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <queue> 5 using namespace std; 6 int vis[10][10],arr[10][10],n,m,xx[]={1,-1,0,0},yy[]={0,0,1,-1}; 7 struct node 8 { 9 int x; 10 int y; 11 int s;//走的步数 12 int t;//剩余时间 13 }; 14 int bfs(node a,node b) 15 { 16 node c,temp; 17 memset(vis,0,sizeof(vis)); 18 queue<node>q; 19 q.push(a); 20 while(!q.empty()) 21 { 22 c=q.front(); 23 q.pop(); 24 for(int i=0; i<4; i++) 25 { 26 temp=c; 27 temp.x=c.x+xx[i]; 28 temp.y=c.y+yy[i]; 29 temp.t--; 30 temp.s++; 31 if(temp.x>=n||temp.x<0||temp.y>=m||temp.y<0||arr[temp.x][temp.y]==0||temp.t<1)//边界和墙处理和当炸弹爆炸后就不继续 32 { 33 continue; 34 } 35 if(temp.x==b.x&&temp.y==b.y&&temp.t>0)//找到出口 36 { 37 return temp.s; 38 } 39 if(arr[temp.x][temp.y]==4)//重置 40 { 41 temp.t=6; 42 } 43 if(vis[temp.x][temp.y]<temp.t)//标记,如果时间比原来标记的或者为被标记的大就标记 44 { 45 vis[temp.x][temp.y]=temp.t; 46 q.push(temp); 47 } 48 } 49 } 50 return -1; 51 } 52 int main() 53 { 54 #ifdef CDZSC_OFFLINE 55 freopen("in.txt","r",stdin); 56 #endif 57 int t,i,j,sum; 58 node aa,bb; 59 scanf("%d",&t); 60 while(t--) 61 { 62 scanf("%d%d",&n,&m); 63 for(i=0; i<n; i++) 64 { 65 for(j=0; j<m; j++) 66 { 67 scanf("%d",&arr[i][j]); 68 } 69 } 70 for(i=0; i<n; i++) 71 { 72 for(j=0; j<m; j++) 73 { 74 if(arr[i][j]==2)//找到入口 75 { 76 aa.x=i; 77 aa.y=j; 78 aa.t=6; 79 aa.s=0; 80 } 81 if(arr[i][j]==3)//出口 82 { 83 bb.x=i; 84 bb.y=j; 85 } 86 } 87 } 88 sum=bfs(aa,bb); 89 printf("%d\n",sum); 90 } 91 return 0; 92 }
标签:
原文地址:http://www.cnblogs.com/Wing0624/p/4253916.html