zoukankan      html  css  js  c++  java
  • HDU1026 (BFS)

    题意:从起点到终点,输出路径长度,时间。

    bfs+记录路径

    View Code
      1 #include<stdio.h>
      2 #include<string.h>
      3 #include<stdlib.h>
      4 #include<queue>
      5 const int N = 105;
      6 const int inf = 9999999;
      7 using namespace std;
      8 
      9 struct node{
     10     int x,y;
     11 };
     12 node p,pp,path[N][N];
     13 struct node2{
     14     int x1,y1,x2,y2;
     15 }out[1000005];
     16 
     17 char map[N][N];
     18 int time[N][N];
     19 int n,m,endflag,ans;
     20 queue<node>q;
     21 
     22 const int dx[]={1,-1,0,0};
     23 const int dy[]={0,0,1,-1};
     24 
     25 void init(){
     26     for(int i=0;i<N;i++)
     27         for(int j=0;j<N;j++){
     28             path[i][j].x=-1;
     29             path[i][j].y=-1;
     30             time[i][j]=inf;
     31         }
     32 }
     33 
     34 bool judge(int x,int y){
     35     if(map[x][y]>='1'&&map[x][y]<='9')
     36         return true;
     37     return false;
     38 }
     39 
     40 void output(){
     41     int nowx,nowy,tpx,tpy,cnt=1;
     42     nowx=n-1;
     43     nowy=m-1;
     44     while(nowx!=0||nowy!=0){
     45         out[cnt].x1=path[nowx][nowy].x;
     46         out[cnt].y1=path[nowx][nowy].y;
     47         out[cnt].x2=nowx;
     48         out[cnt++].y2=nowy;
     49         tpx=nowx;
     50         tpy=nowy;
     51         nowx=path[tpx][tpy].x;
     52         nowy=path[tpx][tpy].y;
     53     }
     54 
     55     int cnt2=1;
     56     for(int i=cnt-1;i>=1;i--)
     57     {
     58         if(judge(out[i].x1,out[i].y1)==false)
     59             printf("%ds:(%d,%d)->(%d,%d)\n",cnt2++,out[i].x1,out[i].y1,out[i].x2,out[i].y2);
     60         else
     61         {
     62             int pp;
     63             pp=map[out[i].x1][out[i].y1]-'0';
     64             for(int j=1;j<=pp;j++)
     65                 printf("%ds:FIGHT AT (%d,%d)\n",cnt2++,out[i].x1,out[i].y1);
     66             printf("%ds:(%d,%d)->(%d,%d)\n",cnt2++,out[i].x1,out[i].y1,out[i].x2,out[i].y2);
     67         }
     68     }
     69     if(endflag!=-1){
     70     int pp;
     71     pp=endflag;
     72         for(int j=1;j<=pp;j++)
     73             printf("%ds:FIGHT AT (%d,%d)\n",cnt2++,n-1,m-1);
     74     }
     75     printf("FINISH\n");
     76 }
     77 
     78 void bfs(){
     79     int i,j,k;
     80     ans=inf;
     81     endflag=-1;
     82     while(!q.empty())q.pop();
     83     p.x=0;
     84     p.y=0;
     85     time[p.x][p.y]=0;
     86     if(judge(0,0)==true)
     87         time[0][0]=map[0][0]-'0';
     88     q.push(p);
     89     while(!q.empty()){
     90         p=q.front();
     91         q.pop();
     92         
     93         if(p.x==n-1&&p.y==m-1)
     94             if(time[n-1][m-1]<ans)
     95                 ans=time[n-1][m-1];
     96                 
     97         for(i=0;i<4;i++){
     98             pp.x=p.x+dx[i];
     99             pp.y=p.y+dy[i];
    100             if(pp.x<0||pp.x>=n||pp.y<0||pp.y>=m)
    101                 continue;
    102             if(map[pp.x][pp.y]=='X')
    103                 continue;
    104             if(map[pp.x][pp.y]=='.'&&time[pp.x][pp.y]>(time[p.x][p.y]+1)){
    105                 time[pp.x][pp.y]=time[p.x][p.y]+1;
    106                 path[pp.x][pp.y].x=p.x;
    107                 path[pp.x][pp.y].y=p.y;
    108                 q.push(pp);
    109             }
    110             if(map[pp.x][pp.y]>='1'&&map[pp.x][pp.y]<='9'){
    111                 if(time[pp.x][pp.y]>(time[p.x][p.y]+map[pp.x][pp.y]-'0'+1)){
    112                     time[pp.x][pp.y]=time[p.x][p.y]+map[pp.x][pp.y]-'0'+1;
    113                     path[pp.x][pp.y].x=p.x;
    114                     path[pp.x][pp.y].y=p.y;
    115                     if(pp.x==n-1&&pp.y==m-1){
    116                         endflag=map[pp.x][pp.y]-'0';
    117                     }
    118                     q.push(pp);
    119                 }
    120             }
    121         }
    122     }
    123     
    124     if(ans!=inf){
    125         printf("It takes %d seconds to reach the target position, let me show you the way.\n",ans);
    126         output();
    127     }
    128     else
    129         printf("God please help our poor hero.\nFINISH\n");
    130     return ;
    131 }
    132 
    133 int main(){
    134     int i;
    135     while( scanf("%d%d",&n,&m)!=EOF ){
    136         memset(map,0,sizeof(map));
    137         for(i=0;i<n;i++)
    138             scanf("%s",map[i]);
    139         init();
    140         bfs();
    141     }
    142     return 0;
    143 }            
    keep moving...
  • 相关阅读:
    Configure文件学习
    实用文章:常用开源协议详细解析
    openwrt的sysupgrade和factory固件的区别
    Linux块设备和字符设备
    eclipse代码补全按键修改成Tab
    Hadoop环境搭载
    比特币中难度调整
    共识机制
    比特币交易本质--UTXO(Unspent Transaction Output)
    多重签名
  • 原文地址:https://www.cnblogs.com/xxx0624/p/2880862.html
Copyright © 2011-2022 走看看