zoukankan      html  css  js  c++  java
  • HDU1026 Ignatius and the Princess I bfs(需要记录路径)

    一开始用递归显示路径会爆栈,后来用数组road[]保存路径就过了

     1 #include<stdio.h>
     2 #include<queue>
     3 #include<string.h>
     4 using namespace std;
     5 int n,m;
     6 char map[110][110],hp[110][110],flag[110][110];
     7 int road[10010][2];
     8 int dir[4][2]={1,0,-1,0,0,1,0,-1};
     9 struct node
    10 {
    11     int x,y,step;
    12     friend bool operator<(node a,node b)
    13     {
    14         return a.step>b.step;       
    15     }       
    16 }cur,next;
    17 int bfs()
    18 {
    19     priority_queue<node>q;
    20     cur.x=0;
    21     cur.y=0;
    22     cur.step=hp[0][0];
    23     map[0][0]='X';
    24     q.push(cur);
    25     while(!q.empty())
    26     {
    27         cur=q.top();
    28         q.pop();
    29         if(cur.x==n-1&&cur.y==m-1) return 1;
    30         for(int i=0;i<4;i++)
    31         {
    32             next.x=cur.x+dir[i][0];
    33             next.y=cur.y+dir[i][1];
    34             if(next.x<0||next.y<0||next.x>=n||next.y>=m||map[next.x][next.y]=='X') continue;
    35             map[next.x][next.y]='X';
    36             next.step=cur.step+hp[next.x][next.y]+1; 
    37             flag[next.x][next.y]=i;
    38             q.push(next);      
    39         }                     
    40     }  
    41     return 0;  
    42 }
    43 int print()
    44 {
    45     road[cur.step][0]=n-1;
    46     road[cur.step][1]=m-1;
    47     int x,y;
    48     int temp=cur.step;
    49     cur.step-=hp[n-1][m-1];
    50     road[cur.step][0]=n-1;
    51     road[cur.step][1]=m-1;
    52     while(!(cur.x==0&&cur.y==0))
    53     {
    54         x=cur.x-dir[flag[cur.x][cur.y]][0];
    55         y=cur.y-dir[flag[cur.x][cur.y]][1]; 
    56         road[cur.step-1][0]=x;
    57         road[cur.step-1][1]=y;
    58         cur.step-=hp[x][y]+1;
    59         road[cur.step][0]=x;
    60         road[cur.step][1]=y;
    61         cur.x=x;
    62         cur.y=y;  
    63     }
    64     for(int i=0;i<=temp-1;i++)
    65     {
    66         int k=i;
    67         printf("%ds:(%d,%d)->(%d,%d)
    ",i+1,road[i][0],road[i][1],road[i+1][0],road[i+1][1]);            
    68         while(hp[road[k+1][0]][road[k+1][1]]--)  
    69         {
    70             i++;
    71             printf("%ds:FIGHT AT (%d,%d)
    ",i+1,road[k+1][0],road[k+1][1]); 
    72         }
    73     }
    74     return 0;
    75 }
    76 int main()
    77 {
    78     while(scanf("%d%d",&n,&m)!=EOF)
    79     {
    80         memset(map,'X',sizeof(map));
    81         memset(hp,0,sizeof(hp));
    82         memset(flag,0,sizeof(flag));
    83         memset(road,0,sizeof(road));
    84         for(int i=0;i<n;i++)
    85         {
    86             scanf("%s",&map[i]); 
    87             for(int j=0;j<m;j++)
    88                 if(map[i][j]!='X'&&map[i][j]!='.') hp[i][j]=map[i][j]-'0';               
    89         }
    90         if(bfs())
    91         {
    92            printf("It takes %d seconds to reach the target position, let me show you the way.
    ",cur.step); 
    93            print();        
    94         }   
    95         else printf("God please help our poor hero.
    ");
    96         printf("FINISH
    ");                            
    97     }
    98 }
  • 相关阅读:
    在线程中使用OpenFileDialog
    Log4net附加
    SQL表间列根据条件复制(赋值)
    DataGridView使用
    Latex使用总结及备忘
    Windows获取文件状态
    TabControl取消首次定位焦点
    C#跨线程调用
    电子词典的查寻程序,发送和接收应答程序
    电子词典的相关子函数db.c程序
  • 原文地址:https://www.cnblogs.com/lqquan/p/3688201.html
Copyright © 2011-2022 走看看