http://acm.hdu.edu.cn/showproblem.php?pid=1026
#include<iostream>
#include
<stdio.h> 
#include
<queue>
#include
<string>
using namespace std;
const int MAX = 100000000;
typedef 
struct node
{
    
int x,y;
    
int time;
}
Node;
struct Infor
{
    
int last_x,last_y;
    
int time;
}
;
int sum;
int n,m;
Infor path[
102][102];
string maps[102];
int a[4][2= {{0,1},{0,-1},{1,0},{-1,0}};
int flag ;

void Bfs()
{
    
int k;
    
int i,j;
    queue
<Node> Q;
    Node p,q;
    p.x 
= n-1;
    p.y 
= m-1;
    
if(maps[p.x][p.y] == '.')
        p.time 
= 0;
    
else
        p.time 
= maps[p.x][p.y] - '0';
    Q.push(p);
    path[p.x][p.y].time 
= p.time;
    
while(!Q.empty())
    
{
        q 
= Q.front();
        Q.pop();
        
if(q.x == 0 && q.y == 0)
        
{
            
if( path[q.x][q.y].time > q.time )
                path[q.x][q.y].time 
= q.time;
        }


        
for(k = 0;k < 4;k++)
        
{
            i 
= q.x + a[k][0];
            j 
= q.y + a[k][1];
            p.x 
= i;
            p.y 
= j;
            
if(i < 0 || i >= n || j < 0 || j >= m)
                
continue;
            
if(maps[i][j] == 'X')
                
continue;

            
if(maps[i][j] == '.')
            
{
                
if(q.time + 1 < path[i][j].time )
                
{
                    p.time 
= path[i][j].time = q.time + 1;
                    path[i][j].last_x 
= q.x;//保存路径 
                    path[i][j].last_y = q.y;
                    Q.push(p);
                }

            }

            
else 
            
{
                
if(q.time + 1 + maps[i][j] - '0' <  path[i][j].time )
                
{
                    p.time 
= path[i][j].time = q.time + 1 + maps[i][j] - '0';
                    path[i][j].last_x 
= q.x;//保存路径
                    path[i][j].last_y = q.y;
                    Q.push(p);
                }

            }


        }

    }

}


void Path(int i,int j,int t)//路径输出 
{    
    
int p,q,k;
    
if(maps[i][j]>='1' && maps[i][j] <='9')
    
{
       k 
= maps[i][j] - '0';            
        
while(k--)
             printf(
"%ds:FIGHT AT (%d,%d)\n",t++,i,j);
    }

    
while(!(i == n-1 && j == m-1))
    
{
        
if(maps[i][j]>='1' && maps[i][j] <='9')
        
{
            k 
= maps[i][j] - '0';            
            
while(k--)
                printf(
"%ds:FIGHT AT (%d,%d)\n",t++,i,j);
            printf(
"%ds:(%d,%d)->(%d,%d)\n",t++,i,j,path[i][j].last_x,path[i][j].last_y);
        }

        
else
        
{   
            printf(
"%ds:(%d,%d)->(%d,%d)\n",t++,i,j,path[i][j].last_x,path[i][j].last_y);
        }

        p 
= path[i][j].last_x;
        q 
= path[i][j].last_y;
        i 
= p;
        j 
= q;
    }

    
if(maps[i][j]>='1' && maps[i][j] <='9')
    
{
        k 
= maps[i][j] - '0';            
        
while(k--)
             printf(
"%ds:FIGHT AT (%d,%d)\n",t++,i,j);
    }

}

int main()
{
    
int i,j;
    
while(cin>>n>>m)
    
{
        
if(n == 0 && m == 0)
            
break;
        
for(i = 0;i < n;i++)
        
{
            cin
>>maps[i];            
        }

        
        
if(maps[0][0== 'X' || maps[n-1][m-1== 'X')//不能走 
        {
            cout
<<"God please help our poor hero."<<endl;
            cout
<<"FINISH"<<endl;
            
continue;
        }


        
for(i = 0;i < n;i++)
            
for(j = 0;j < m;j++)
            
{
                path[i][j].last_x 
= i;
                path[i][j].last_y 
= j;
                path[i][j].time 
= MAX;
            }

        Bfs();
        
if(path[0][0].time != MAX)
        
{
            printf(
"It takes %d seconds to reach the target position, let me show you the way.\n",path[0][0].time);
            Path(
0,0,1);
        }

        
else
        
{
            cout
<<"God please help our poor hero."<<endl;
        }

        cout
<<"FINISH"<<endl;
    }

    
return 0;
}