/*
题意:给一个n*m的图,图中有X,有.有数字,x代表墙,.代表路,数字代表当走到这个地方的时候,还要停留多少
秒,问你从左上角到右下角的最少时间是多少。当能走通的时候,要把路径打印出来。
除了Map数组和标记数组之外,还应该有一个结构体数组存放当前点是由那个点广搜过来的
*/
#include<stdio.h>
#include<queue>
#include<string.h>
using namespace std;
char Map[105][105];//存图
int Map1[105][105]/*标记数组*/,bu[4][2]={0,1,0,-1,1,0,-1,0},n,m;
struct node
{
int x,y,temp;
friend bool operator <(node p,node q)
{
return p.temp>q.temp;
}
}S,D;
node MM[105][105];//结构体数组存放该点是由那个点广搜过来的
int bfs()
{
memset(Map1,0,sizeof(Map1));
priority_queue<node> v;
while(!v.empty())
v.pop();
node l,r;
int i;
v.push(S);
Map1[S.x][S.y]=1;
while(!v.empty())
{
l=v.top();
//printf("++++%d %d %d\n",l.x,l.y,l.temp);
v.pop();
if(l.x==D.x&&l.y==D.y)
return l.temp;
for(i=0;i<4;i++)
{
int aa=l.x+bu[i][0];
int bb=l.y+bu[i][1];
if(aa>=0&&aa<n&&bb>=0&&bb<m&&Map1[aa][bb]==0&&Map[aa][bb]!='X')
{
Map1[aa][bb]=1;
MM[aa][bb].x=l.x;MM[aa][bb].y=l.y;
r.x=aa;r.y=bb;
if(Map[aa][bb]=='.')
r.temp=l.temp+1;
else
r.temp=l.temp+Map[aa][bb]-'0'+1;
//printf("%d %d %d\n",r.x,r.y,r.temp);
v.push(r);
}
}
}
return -1;
}
void Printf(int aa,int nn,int mm)//通过递归输出图
{
if(aa==1)//当aa是1秒的时候开始输出
{
printf("%ds:(%d,%d)->(%d,%d)\n",aa,MM[nn][mm].x,MM[nn][mm].y,nn,mm);
return ;
}
else
{
if(Map[nn][mm]>'0'&&Map[nn][mm]<='9')//当时数字的时候输出这么多次
{
Map[nn][mm]-=1;//图中的数字减1
Printf(aa-1,nn,mm);//先递归,当递归回来时在输出图
printf("%ds:FIGHT AT (%d,%d)\n",aa,nn,mm);//输出图
}
else
{
Printf(aa-1,MM[nn][mm].x,MM[nn][mm].y);//当图中是点的时候先递归后输出图
printf("%ds:(%d,%d)->(%d,%d)\n",aa,MM[nn][mm].x,MM[nn][mm].y,nn,mm);//输出图
}
}
}
int main()
{
int i;
S.x=0;S.y=0;
while(scanf("%d%d",&n,&m)!=EOF)
{
D.x=n-1;D.y=m-1;
for(i=0;i<n;i++)
scanf("%s",Map[i]);
int aa=bfs();
if(aa==-1)
{
printf("God please help our poor hero.\nFINISH\n");
}
else
{
printf("It takes %d seconds to reach the target position, let me show you the way.\n",aa);
Printf(aa,n-1,m-1);//输出图的函数
printf("FINISH\n");
}
}
return 0;
}
题意:给一个n*m的图,图中有X,有.有数字,x代表墙,.代表路,数字代表当走到这个地方的时候,还要停留多少
秒,问你从左上角到右下角的最少时间是多少。当能走通的时候,要把路径打印出来。
除了Map数组和标记数组之外,还应该有一个结构体数组存放当前点是由那个点广搜过来的
*/
#include<stdio.h>
#include<queue>
#include<string.h>
using namespace std;
char Map[105][105];//存图
int Map1[105][105]/*标记数组*/,bu[4][2]={0,1,0,-1,1,0,-1,0},n,m;
struct node
{
int x,y,temp;
friend bool operator <(node p,node q)
{
return p.temp>q.temp;
}
}S,D;
node MM[105][105];//结构体数组存放该点是由那个点广搜过来的
int bfs()
{
memset(Map1,0,sizeof(Map1));
priority_queue<node> v;
while(!v.empty())
v.pop();
node l,r;
int i;
v.push(S);
Map1[S.x][S.y]=1;
while(!v.empty())
{
l=v.top();
//printf("++++%d %d %d\n",l.x,l.y,l.temp);
v.pop();
if(l.x==D.x&&l.y==D.y)
return l.temp;
for(i=0;i<4;i++)
{
int aa=l.x+bu[i][0];
int bb=l.y+bu[i][1];
if(aa>=0&&aa<n&&bb>=0&&bb<m&&Map1[aa][bb]==0&&Map[aa][bb]!='X')
{
Map1[aa][bb]=1;
MM[aa][bb].x=l.x;MM[aa][bb].y=l.y;
r.x=aa;r.y=bb;
if(Map[aa][bb]=='.')
r.temp=l.temp+1;
else
r.temp=l.temp+Map[aa][bb]-'0'+1;
//printf("%d %d %d\n",r.x,r.y,r.temp);
v.push(r);
}
}
}
return -1;
}
void Printf(int aa,int nn,int mm)//通过递归输出图
{
if(aa==1)//当aa是1秒的时候开始输出
{
printf("%ds:(%d,%d)->(%d,%d)\n",aa,MM[nn][mm].x,MM[nn][mm].y,nn,mm);
return ;
}
else
{
if(Map[nn][mm]>'0'&&Map[nn][mm]<='9')//当时数字的时候输出这么多次
{
Map[nn][mm]-=1;//图中的数字减1
Printf(aa-1,nn,mm);//先递归,当递归回来时在输出图
printf("%ds:FIGHT AT (%d,%d)\n",aa,nn,mm);//输出图
}
else
{
Printf(aa-1,MM[nn][mm].x,MM[nn][mm].y);//当图中是点的时候先递归后输出图
printf("%ds:(%d,%d)->(%d,%d)\n",aa,MM[nn][mm].x,MM[nn][mm].y,nn,mm);//输出图
}
}
}
int main()
{
int i;
S.x=0;S.y=0;
while(scanf("%d%d",&n,&m)!=EOF)
{
D.x=n-1;D.y=m-1;
for(i=0;i<n;i++)
scanf("%s",Map[i]);
int aa=bfs();
if(aa==-1)
{
printf("God please help our poor hero.\nFINISH\n");
}
else
{
printf("It takes %d seconds to reach the target position, let me show you the way.\n",aa);
Printf(aa,n-1,m-1);//输出图的函数
printf("FINISH\n");
}
}
return 0;
}