zoukankan      html  css  js  c++  java
  • hdu 1026 bfs+记录路径

    题意:从0,0点出发到n-1,m-1点,路上的数字代表要在这个点额外待多少秒,求最短的路

    递归输出路径即可

      1 #include<cstdio>
      2 #include<iostream>
      3 #include<algorithm>
      4 #include<cstring>
      5 #include<cmath>
      6 #include<queue>
      7 #include<map>
      8 using namespace std;
      9 #define MOD 1000000007
     10 const int INF=0x3f3f3f3f;
     11 const double eps=1e-5;
     12 #define cl(a) memset(a,0,sizeof(a))
     13 #define ts printf("*****
    ");
     14 const int MAXN=1005;
     15 int n,m,tt;
     16 int sumt=0;
     17 struct node
     18 {
     19     int x,y,t;
     20     node(){}
     21     node(int xx,int yy,int tt)
     22     {
     23         x=xx,y=yy,t=tt;
     24     }
     25     friend bool operator<(node a,node b)
     26     {
     27         return a.t>b.t;
     28     }
     29 };
     30 bool vis[MAXN][MAXN];
     31 int dir[MAXN][MAXN];
     32 char maze[MAXN][MAXN];
     33 int d[4][2]={0,1,1,0,-1,0,0,-1};
     34 int kk=0;
     35 int outpath(int x,int y)    //递归输出,从x,y出发所在的时间
     36 {
     37     if(x==0&&y==0)
     38     {
     39         int nt=1;
     40         printf("%ds:(%d,%d)->",nt,x,y);
     41         return nt;
     42     }
     43     else
     44         kk=dir[x][y];
     45     int nt=outpath(x-d[kk][0],y-d[kk][1]);
     46     printf("(%d,%d)
    ",x,y);
     47     if(0<maze[x][y]-'0'&&maze[x][y]-'0'<=9)
     48     {
     49         int l=maze[x][y]-'0';
     50         while(l--)
     51         printf("%ds:FIGHT AT (%d,%d)
    ",++nt,x,y);
     52     }
     53     if(nt==sumt) return 0;
     54     printf("%ds:(%d,%d)->",++nt,x,y);
     55     return nt;
     56 }
     57 void bfs()
     58 {
     59     node now,next;
     60     priority_queue<node> q;
     61     q.push(node(0,0,0));
     62     vis[0][0]=1;
     63     while(!q.empty())
     64     {
     65         now=q.top();
     66         q.pop();
     67         if(now.x==n-1&&now.y==m-1)
     68         {
     69             printf("It takes %d seconds to reach the target position, let me show you the way.
    ",now.t);
     70             sumt=now.t;
     71             outpath(n-1,m-1);
     72             printf("FINISH
    ");
     73             return;
     74         }
     75         for(int i=0;i<4;i++)
     76         {
     77             next.x=now.x+d[i][0];
     78             next.y=now.y+d[i][1];
     79             next.t=now.t+1;
     80             if(next.x>=0&&next.y>=0&&next.x<n&&next.y<m&&!vis[next.x][next.y]&&maze[next.x][next.y]!='X')
     81             {
     82                 if('0'<maze[next.x][next.y]&&maze[next.x][next.y]<='9')
     83                 {
     84                     next.t+=maze[next.x][next.y]-'0';
     85                     vis[next.x][next.y]=1;
     86                     dir[next.x][next.y]=i;
     87                     q.push(next);
     88                 }
     89                 else
     90                 {
     91                     dir[next.x][next.y]=i;
     92                     vis[next.x][next.y]=1;
     93                     q.push(next);
     94                 }
     95             }
     96         }
     97     }
     98     puts("God please help our poor hero.
    FINISH");
     99 }
    100 int main()
    101 {
    102     int i,j,k;
    103     #ifndef ONLINE_JUDGE
    104     freopen("1.in","r",stdin);
    105     #endif
    106     while(scanf("%d%d",&n,&m)!=EOF)
    107     {
    108         for(i=0;i<n;i++)
    109         {
    110             scanf("%s",maze[i]);
    111         }
    112         cl(vis);
    113         bfs();
    114     }
    115 }
  • 相关阅读:
    Ubuntu上安装Redis
    Unity Shader中将指定颜色过滤成透明
    用Python发送邮件
    Flask搭建简单的服务器
    SQLServer 中All、Any和Some用法与区别
    Linux探秘之用户态与内核态
    MTDDL 美团点评分布式数据访问层中间件
    基础数据结构 例:栈、队列、链表、数据、字典、树、等
    二叉树、红黑树、B&B+树数据结构
    CPU,GPU,高速缓存cache,内存RAM,虚拟内存VM,磁盘ROM,磁盘缓存之间的关系
  • 原文地址:https://www.cnblogs.com/cnblogs321114287/p/4462066.html
Copyright © 2011-2022 走看看