拯救行动
作者:互联网
题目:
这道题目非常难简单就花了我一个上午小时而已这道题就在bfs的模板上加亿些东西即可,这道题有守卫之后就要+2,要按step顺序从小到大遍历因此新的节点入队后要根据step值从小到大排序,还有一个点值得注意这道题要用到手写队列。
这道题目可以用优先队列来解决,但是我不会为了更直观就用手写队列
这里要改几个点:
1.要有flag记录到没到(这道题还可能到不了)
2.排序时cmp只能是 < 或 > 不能用 =
3。vis更新时要判断新点是守卫还是路(是守卫+2,是路+1)
4.要记录起始点
5.队列,vis初始化
手动队列操作大全:
1.空队列: t=-1 h=0
2.不为空: h<=t
3.入队: q[++t]=np
4.弹出: h++
5.首节点: q[h]
程序:
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1e5; 4 struct point{ 5 int x; 6 int y; 7 int step; 8 }; 9 int t=-1,h=0,n,m,d[10][10]={{1,0},{0,1},{-1,0},{0,-1}},vis[300][300]={0}; 10 point q[N]; 11 string a[300]; 12 point s,e; 13 int flag=0; 14 void output() 15 { 16 cout<<"vis"; 17 for(int i=0;i<n;i++) 18 { 19 for(int j=0;j<m;j++) 20 { 21 cout<<vis[i][j]<<" "; 22 } 23 cout<<endl; 24 } 25 } 26 int cmp(point a,point b) 27 { 28 return a.step<b.step; 29 } 30 void bfs(point s) 31 { 32 q[++t]=s; 33 s.step=0; 34 while(h<=t) 35 { 36 point op=q[h]; 37 if(op.x==e.x&&op.y==e.y) 38 { 39 flag=1; 40 e=op; 41 return; 42 } 43 for(int i=0;i<4;i++) 44 { 45 point np; 46 np.x=op.x+d[i][0]; 47 np.y=op.y+d[i][1]; 48 if(np.x>=0&&np.x<n&&np.y>=0&&np.y<m&&a[np.x][np.y]!='#'&&vis[np.x][np.y]==0) 49 { 50 if(a[np.x][np.y]=='x') 51 { 52 vis[np.x][np.y]=vis[op.x][op.y]+2; 53 np.step=op.step+2; 54 } 55 else 56 { 57 vis[np.x][np.y]=vis[op.x][op.y]+1; 58 np.step=op.step+1; 59 } 60 q[++t]=np; 61 } 62 } 63 h++; 64 sort(q+h,q+t+1,cmp); 65 } 66 } 67 int main() 68 { 69 int t1; 70 cin>>t1; 71 while(t1--) 72 { 73 t=-1; 74 h=0; 75 memset(q,0,sizeof(q)); 76 memset(vis,0,sizeof(vis)); 77 cin>>n>>m; 78 for(int i=0;i<n;i++) 79 { 80 cin>>a[i]; 81 for(int j=0;j<m;j++) 82 { 83 if(a[i][j]=='a') 84 { 85 e.x=i; 86 e.y=j; 87 } 88 else if(a[i][j]=='r') 89 { 90 s.x=i; 91 s.y=j; 92 } 93 } 94 } 95 vis[s.x][s.y]=1; 96 bfs(s); 97 if(flag==1) cout<<e.step<<endl; 98 else cout<<"Impossible"<<endl; 99 } 100 }
标签:队列,int,300,行动,vis,step,这道题,拯救 来源: https://www.cnblogs.com/wjk53233/p/16099170.html