标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 16713 Accepted Submission(s): 5327
Special Judge
#include <iostream> #include <queue> using namespace std; const int MAXN=105; const int INF=0x3f3f3f3f; struct Node{ int y,x,hp,step,id,pre; Node(){} Node(int y,int x,int hp,int step,int id,int pre) { this->y=y; this->x=x; this->hp=hp; this->step=step; this->id=id; this->pre=pre; } bool operator<(const Node& no)const { return step > no.step; } }path[10005]; int tot; int n,m; int t[MAXN][MAXN]; char mz[MAXN][MAXN]; int dy[4]={0,1,0,-1}; int dx[4]={1,0,-1,0}; int start; int time; void print(int k) { Node now=path[k]; if(now.pre==-1) { ++time; cout<<time<<"s:("<<now.y<<","<<now.x<<")->"; return ; } print(now.pre); cout<<"("<<now.y<<","<<now.x<<")"<<endl; for(int i=0;i<now.hp;i++) { ++time; cout<<time<<"s:FIGHT AT ("<<now.y<<","<<now.x<<")"<<endl; } time++; if(k!=start) cout<<time<<"s:("<<now.y<<","<<now.x<<")->"; } void bfs() { tot=0; for(int i=0;i<MAXN;i++) for(int j=0;j<MAXN;j++) t[i][j]=INF; priority_queue<Node> que; Node now(0,0,0,0,tot,-1); path[tot++]=now; que.push(now); t[0][0]=0; while(!que.empty()) { now=que.top();que.pop(); if(now.y==n-1&&now.x==m-1) { start=now.id; cout<<"It takes "<<path[start].step<<" seconds to reach the target position, let me show you the way."<<endl; time=0; print(start); return ; } for(int i=0;i<4;i++) { int ny=now.y+dy[i]; int nx=now.x+dx[i]; if(0<=ny&&ny<n&&0<=nx&&nx<m&&mz[ny][nx]!=‘X‘) { int hp=0; if(mz[ny][nx]!=‘.‘) hp=hp+mz[ny][nx]-‘0‘; int nstep=now.step+hp+1; if(nstep<t[ny][nx]) { t[ny][nx]=nstep; Node next=Node(ny,nx,hp,nstep,tot,now.id); que.push(next); path[tot++]=next; } } } } cout<<"God please help our poor hero."<<endl; } int main() { while(cin>>n>>m) { for(int i=0;i<n;i++) cin>>mz[i]; bfs(); cout<<"FINISH"<<endl; } return 0; }
标签:
原文地址:http://www.cnblogs.com/program-ccc/p/5674344.html