其他分享
首页 > 其他分享> > 拯救行动

拯救行动

作者:互联网

题目:

 

 这道题目非常难简单就花了我一个上午小时而已这道题就在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