经过考试后小学期训练的第一个题~
BFS,注意下输出路径时候的特殊处理即可。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=103;
struct node
{
int x;
int y;
int ans;
int pre;
int res;
}q[100001];
int n,m,movex[4]={0,0,-1,1},movey[4]={1,-1,0,0};
char map[maxn][maxn];
bool vis[maxn][maxn];
int BFS()
{
memset(vis,0,sizeof(vis));
int pre=0,last=0,ans=0;
q[last++]=(node){1,1,0,-1,map[1][1]=='.'?0:map[1][1]-'0'};
vis[1][1]=1;
while(pre<last)
{
node now=q[pre];
if(now.res)
{
q[last]=now;
q[last].ans++;
q[last++].res--;
pre++;
continue;
}
if(now.x==n&&now.y==m)
return pre;
for(int i=0;i<4;i++)
{
int itx=now.x+movex[i];
int ity=now.y+movey[i];
if(vis[itx][ity]||map[itx][ity]=='X')
continue;
vis[itx][ity]=1;
int res=map[itx][ity]=='.'?0:map[itx][ity]-'0';
q[last++]=(node){itx,ity,now.ans+1,pre,res};
}
pre++;
}
return -1;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=1;i<=n;i++)
scanf("%s",map[i]+1);
for(int i=0;i<=n+1;i++)
map[i][0]=map[i][m+1]='X';
for(int i=0;i<=m+1;i++)
map[0][i]=map[n+1][i]='X';
int ans=BFS();
if(ans==-1)
{
printf("God please help our poor hero.\n");
printf("FINISH\n");
continue;
}
printf("It takes %d seconds to reach the target position, let me show you the way.\n",q[ans].ans);
int o[1001],len=0,index=ans;
while(index!=-1)
{
o[len++]=index;
index=q[index].pre;
}
int t=1;
for(int i=len-2;i>=0;i--)
{
if(map[q[o[i]].x][q[o[i]].y]!='.')
{
printf("%ds:(%d,%d)->(%d,%d)\n",t++,q[o[i+1]].x-1,q[o[i+1]].y-1,q[o[i]].x-1,q[o[i]].y-1);
while(map[q[o[i]].x][q[o[i]].y]-'0')
{
printf("%ds:FIGHT AT (%d,%d)\n",t++,q[o[i]].x-1,q[o[i]].y-1);
map[q[o[i]].x][q[o[i]].y]--;
}
}
else
printf("%ds:(%d,%d)->(%d,%d)\n",t++,q[o[i+1]].x-1,q[o[i+1]].y-1,q[o[i]].x-1,q[o[i]].y-1);
}
printf("FINISH\n");
}
return 0;
}