这个题很简单
就是bfs+保存路径
题意是:公主被抓走了,勇士去救公主,遇到点(.)时间加1,遇到X不饿能够通过,遇到数字就是遇到怪物,需要打败怪物需要的时间就是数值。
一开始用dfs做的,超时了,然后转为bfs,就过了,就是保存路径时有点麻烦,需要记录前一点的路径
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
char map[110][110];
int vis[110][110];
int n,m,mins,tt,count[110][110];
int dx[10010],dy[10010];
struct xxyy{
int x,y;
}tmpdx[110][110];
int fx[4]={0,1,-1,0};
int fy[4]={1,0,0,-1};
void bfs(int x,int y){
queue<pair<int,int> >que;
que.push(make_pair(x,y));
while(!que.empty()){
x=que.front().first;
y=que.front().second;
que.pop();
if(x==m-1&&y==n-1){
if(count[x][y]<mins){
tt=0;
mins=count[x][y];
int kx=x,ky=y;
int a,b;
dx[tt]=kx;
dy[tt++]=ky;
while(!(kx==0&&ky==0)){
/*if(tt>20){
break;
}*/
a=tmpdx[kx][ky].x;
b=tmpdx[kx][ky].y;
kx=a;
ky=b;
dx[tt]=kx;
dy[tt++]=ky;
// printf("%d %d\n",kx,ky);
}
continue;
//printf("%d %d\n",dx[i],dy[i]);
}
}
if(count[x][y]>mins){
continue;
}
for(int i=0;i<4;i++){
int xx=x+fx[i];
int yy=y+fy[i];
if(xx>=m||yy>=n||xx<0||yy<0){
continue;
}
if(map[xx][yy]!='X'&&!vis[xx][yy]){
vis[xx][yy]=1;
tmpdx[xx][yy].x=x;
tmpdx[xx][yy].y=y;
if(map[xx][yy]=='.'){
//printf("%d %d\n",xx,yy);
count[xx][yy]=count[x][y]+1;
if(count[xx][yy]<mins)
que.push(make_pair(xx,yy));
}
else if(map[xx][yy]>='1'&&map[xx][yy]<='9'){
//printf("%d %d\n",xx,yy);
count[xx][yy]=count[x][y]+map[xx][yy]-'0'+1;
if(count[xx][yy]<mins)
que.push(make_pair(xx,yy));
}
}
}
}
}
int main(){
//freopen("c:\\1.txt","r",stdin);
while(scanf("%d%d",&m,&n)!=EOF){
mins=1<<30;
memset(count,0,sizeof(count));
memset(vis,0,sizeof(vis));
//printf("%d\n",mins);
for(int i=0;i<m;i++){
scanf("%s",map[i]);
//printf("%s\n",map[i]);
}
//printf("%c\n",map[m-1][n-1]);
vis[0][0]=1;
bfs(0,0);
if(mins==1<<30){
printf("God please help our poor hero.\nFINISH\n");
continue;
}
printf("It takes %d seconds to reach the target position, let me show you the way.\n",mins);
int k=1;
for(int i=tt-2;i>=0;i--){
if(map[dx[i]][dy[i]]=='.'){
printf("%ds:(%d,%d)->(%d,%d)\n",k++,dx[i+1],dy[i+1],dx[i],dy[i]);
}
if(map[dx[i]][dy[i]]>='1'&&map[dx[i]][dy[i]]<='9'){
printf("%ds:(%d,%d)->(%d,%d)\n",k++,dx[i+1],dy[i+1],dx[i],dy[i]);
for(int j=0;j<map[dx[i]][dy[i]]-'0';j++){
printf("%ds:FIGHT AT (%d,%d)\n",k++,dx[i],dy[i]);
}
}
}
printf("FINISH\n");
}
return 0;
}