题意:看下面的输入,不难看出这又是道走迷宫题,输入有多组,每组先输入两个数n、m,然后下面有n列m行。‘.’表示能走的路,‘X’表示不能落脚的墙,数字表示走到这个位置需要停留的时间。最后求从最上角,走到右下角需要多长时间,然后逐秒输出路径,停留的点也要输出。如输出。
#include
#include
#include
#include
using namespace std;
int time,n,m;
int mark[105][105];
char c[105][105];
struct node
{
int x,y,t;
friend bool operator<(node a,node b)
{
return a.t>b.t;
}
};
struct node1
{
int x,y;
} point[10005];
int vis[4][2]= {0,1,0,-1,1,0,-1,0};
int ok(int x,int y)
{
if(x>=0&&x<=n-1&&y>=0&y<=m-1&&c[x][y]!='X')
return 1;
else
return 0;
}
void output(int x,int y,int t)
{
point[t].x=x;
point[t].y=y;
while(t!=1)//倒序传入数组。
{
if(c[x][y]!='.')//停留多少步,就循环多少次存入point数组
{
int s=c[x][y]-'0';
while(s--)
{
point[--t].x=x;
point[t].y=y;
}
}
for(int i=0; i<4; i++)
{
int zx=x+vis[i][0];
int zy=y+vis[i][1];
if(ok(zx,zy)&&mark[zx][zy]==t-1)
{
t--;
point[t].x=zx;
point[t].y=zy;
x=zx;
y=zy;
break;
}
}
}
point[0].x=0;
point[0].y=0;
for(int i=1; i<=time; i++)
{
if(point[i-1].x==point[i].x&&point[i-1].y==point[i].y)
{
printf("%ds:FIGHT AT (%d,%d)\n",i,point[i].x,point[i].y);
continue;
}
printf("%ds:(%d,%d)->(%d,%d)\n",i,point[i-1].x,point[i-1].y,point[i].x,point[i].y);
}
}
int bfs()
{
node q,p;
q.t=0;
q.x=0,q.y=0;
priority_queueque;
que.push(q);
while(que.size())
{
q=que.top();
que.pop();
if(q.x==n-1&&q.y==m-1)
return q.t;
for(int i=0; i<4; i++)
{
p.x=q.x+vis[i][0];
p.y=q.y+vis[i][1];
if(ok(p.x,p.y)&&!mark[p.x][p.y])
{
p.t=q.t+1;
if(c[p.x][p.y]!='.')
p.t=p.t+c[p.x][p.y]-48;
mark[p.x][p.y]=p.t;
que.push(p);
}
}
}
return 0;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
for(int i=0; i