一个标准的BFS问题
思路如下:
运用BFS 搜索地图,如果某个点到达花费的时间比之前到达花费的时间少,那么就用本次到达的时间标记这个点,然后储存路径我用的数组LJ[][],打印整条路径即可
注意
1.储存路径的时候只能存储某个点的来源,因此无法打印入口到出口的,所以反向搜索,从出口往入口搜,这样就能保存一条入口到出口的路了
2.某个点可能因为先后到达的时间不同而多次经过,如下面这个数据
.9...
.9.9.
...9.
代码如下:
<pre name="code" class="cpp">#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
int map[102][102];
struct MAP{
int x;
int y;
};
int m,n;
queue<MAP>q;
MAP visit[102][102],t,DIAN;
int TIME[102][102];
void BFS(){
while(!q.empty())q.pop();
DIAN.x=m-1;DIAN.y=n-1;
TIME[DIAN.x][DIAN.y]=0;
q.push(DIAN);
int chose[5][2]={0,0,0,1,0,-1,1,0,-1,0};
while(!q.empty()){
DIAN=q.front();
q.pop();
for(int i=1;i<=4;i++){
t.x=DIAN.x+chose[i][0];
t.y=DIAN.y+chose[i][1];
if(t.x<=m-1 && t.y<=n-1 && t.x>=0 && t.y>=0 && map[t.x][t.y]!='X'){
if(map[t.x][t.y]=='.' && TIME[t.x][t.y]>TIME[DIAN.x][DIAN.y]+1){
TIME[t.x][t.y]=TIME[DIAN.x][DIAN.y]+1;
q.push(t);
visit[t.x][t.y].x=DIAN.x;
visit[t.x][t.y].y=DIAN.y;
}
else if(map[t.x][t.y]!='.' &&
TIME[t.x][t.y]>TIME[DIAN.x][DIAN.y]+map[t.x][t.y]+1-'0'){
TIME[t.x][t.y]=TIME[DIAN.x][DIAN.y]+map[t.x][t.y]+1-'0';
q.push(t);
visit[t.x][t.y].x=DIAN.x;
visit[t.x][t.y].y=DIAN.y;
}
}
}
}
}
int main(){
while(~scanf("%d%d",&m,&n)){
memset(visit,0,sizeof(visit));
memset(map,0,sizeof(map));
int i=0,j=0;
for(i=0;i<102;i++){
for(j=0;j<102;j++)TIME[i][j]=9999;
}
getchar();
for(i=0;i<m;i++){
for(j=0;j<n;j++){
scanf("%c",&map[i][j]);
}
getchar();
}
BFS();
int X=0,Y=0,time;
if(TIME[0][0]==9999){
printf("God please help our poor hero.\n");
printf("FINISH\n");
}
else{
if(map[m-1][n-1]!='.'){
time=TIME[0][0]+map[m-1][n-1]-'0';
}
else time=TIME[0][0];
printf("It takes %d seconds to reach the target position, let me show you the way.\n",time);
for(i=1;i<=TIME[0][0];i++){
if(TIME[X][Y]-TIME[visit[X][Y].x][visit[X][Y].y]!=1){
int temp=TIME[X][Y]-TIME[visit[X][Y].x][visit[X][Y].y]-1;
while(temp--){
printf("%ds:FIGHT AT (%d,%d)\n",i,X,Y);
i++;
}
}
printf("%ds:(%d,%d)->(%d,%d)\n",i,X,Y,visit[X][Y].x,visit[X][Y].y);
int AX=X,AY=Y;
X=visit[AX][AY].x;Y=visit[AX][AY].y;
}
while(i<=time){
printf("%ds:FIGHT AT (%d,%d)\n",i,X,Y);
i++;
}
printf("FINISH\n");
}
}
}