进bfs了。。。
蒟蒻的自我拯救。。。
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int mak[110][110];
int d[4][2]={1,0,-1,0,0,-1,0,1};
int t,n,m;
struct node
{
int x,y,time;
friend int operator<(node a,node b)
{
return a.time>b.time;
}
};
struct out
{
char c;
int lx,ly,fight;
}map[110][110];
/*
struct cmp
{
bool operator()(const node &a,const node &b)
{
return a.time>b.time;
}
};
*/
priority_queue<node> q;
bool find(node first)
{
node now,next;
while(!q.empty())q.pop();
if(map[first.x][first.y].c>='0'&&map[first.x][first.y].c<='9')
{
map[first.x][first.y].fight=map[first.x][first.y].c-'0';
first.time=map[first.x][first.y].fight;
}
else first.time=0;
q.push(first);
while(!q.empty())
{
now=q.top();
q.pop();
if(now.x==0&&now.y==0)
{
t=now.time;
return true;
}
for(int i=0;i<4;++i)
{
next.x=now.x+d[i][0];
next.y=now.y+d[i][1];
if(next.x<0||next.y<0||next.x==n||next.y==m||map[next.x][next.y].c=='X'||mak[next.x][next.y]) continue;
mak[next.x][next.y]=1;
next.time=now.time+1;
if(map[next.x][next.y].c>='0'&&map[next.x][next.y].c<='9')
{
map[next.x][next.y].fight=map[next.x][next.y].c-'0';
next.time+=map[next.x][next.y].fight;
}
map[next.x][next.y].lx=now.x;
map[next.x][next.y].ly=now.y;
q.push(next);
}
}
return false;
}
int main()
{
node first;
// freopen("F://cs.txt","r",stdin);
while(scanf("%d%d",&n,&m)!=EOF)
{
getchar();
memset(mak,0,sizeof(mak));
for(int i=0;i<n;++i)
{
for(int j=0;j<m;++j)
{
scanf("%c",&map[i][j].c);
map[i][j].fight=0;
}
getchar();
}
first.x=n-1;
first.y=m-1;
first.time=0;
if(find(first))
{
printf("It takes %d seconds to reach the target position, let me show you the way.\n",t);
int k=1,x=0,y=0;
int nx,ny;
while(k<=t)
{
nx=map[x][y].lx,ny=map[x][y].ly;
printf("%ds:(%d,%d)->(%d,%d)\n",k++,x,y,nx,ny);
while(map[nx][ny].fight)
{
printf("%ds:FIGHT AT (%d,%d)\n",k++,nx,ny);
--map[nx][ny].fight;
}
x=nx;y=ny;
}
}
else puts("God please help our poor hero.");
puts("FINISH");
}
return 0;
}