5 6 .XX.1. ..X.2. 2...X. ...XX. XXXXX. 5 6 .XX.1. ..X.2. 2...X. ...XX. XXXXX1 5 6 .XX... ..XX1. 2...X. ...XX. XXXXX.
It takes 13 seconds to reach the target position, let me show you the way. 1s:(0,0)->(1,0) 2s:(1,0)->(1,1) 3s:(1,1)->(2,1) 4s:(2,1)->(2,2) 5s:(2,2)->(2,3) 6s:(2,3)->(1,3) 7s:(1,3)->(1,4) 8s:FIGHT AT (1,4) 9s:FIGHT AT (1,4) 10s:(1,4)->(1,5) 11s:(1,5)->(2,5) 12s:(2,5)->(3,5) 13s:(3,5)->(4,5) FINISH It takes 14 seconds to reach the target position, let me show you the way. 1s:(0,0)->(1,0) 2s:(1,0)->(1,1) 3s:(1,1)->(2,1) 4s:(2,1)->(2,2) 5s:(2,2)->(2,3) 6s:(2,3)->(1,3) 7s:(1,3)->(1,4) 8s:FIGHT AT (1,4) 9s:FIGHT AT (1,4) 10s:(1,4)->(1,5) 11s:(1,5)->(2,5) 12s:(2,5)->(3,5) 13s:(3,5)->(4,5) 14s:FIGHT AT (4,5) FINISH God please help our poor hero. FINISH#include<iostream> #include<queue> #include<stack> using namespace std; char map[200][200]; struct Node{ int x,y; int prex,prey; int cost; }; int n,m; int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}}; Node path[200][200]; void init() { for(int i=0;i<n;i++) for(int j=0;j<m;j++) path[i][j].cost=-1; } bool isBound(int x,int y) { if(x<0||y<0) return false; if(x>=n||y>=m) return false; return true; } void bfs() { Node a,b; queue<Node> qu; a.x=0;a.y=0;a.cost=0; a.prex=0;a.prey=0; qu.push(a); while(!qu.empty()) { a=qu.front(); qu.pop(); for(int i=0;i<4;i++) { b.x=a.x+dir[i][0]; b.y=a.y+dir[i][1]; if(!isBound(b.x,b.y)) continue; if(map[b.x][b.y]=='X') continue; if(map[b.x][b.y]=='.') b.cost=a.cost+1; else b.cost=a.cost+map[b.x][b.y]-'0'+1; if(b.cost<path[b.x][b.y].cost||path[b.x][b.y].cost==-1) { b.prex=a.x;b.prey=a.y; path[b.x][b.y]=b; qu.push(b); } } } if(path[n-1][m-1].cost==-1) { cout<<"God please help our poor hero."<<endl; cout<<"FINISH"<<endl; return; } stack<Node> s; int cc=1,tmp; cout<<"It takes "<<path[n - 1][m - 1].cost<< " seconds to reach the target position, let me show you the way."<<endl; a=path[n-1][m-1]; while(1){ if(a.x==0&&a.y==0) break; s.push(a); a=path[a.prex][a.prey]; } a=path[0][0]; while(!s.empty()) { b=s.top(); s.pop(); if(map[b.x][b.y] == '.') cout<<cc++<<"s:("<<a.x<<","<<a.y<<")->("<<b.x<<","<<b.y<<")"<<endl; else { cout<<cc++<<"s:("<<a.x<<","<<a.y<<")->("<<b.x<<","<<b.y<<")"<<endl; tmp = map[b.x][b.y] - '0'; while(tmp--) cout<<cc++<<"s:FIGHT AT ("<<b.x<<","<<b.y<<")"<<endl; } a = b; } cout<<"FINISH"<<endl; } int main() { while(cin>>n>>m) { for(int i=0;i<n;i++) { for(int j=0;j<m;j++) cin>>map[i][j]; } init(); bfs(); } return 0; }