HDU 1026 Ignatius and the Princess I
题意:给定一张图,X位置不能走,带数字的位置需要在该位置停留 '数字' 秒。然后回溯走的路程
思路:BFS+回溯;
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long LL;
typedef pair<int ,int > P;
#define inf 0x3f3f3f3f
struct node
{
int x,y;
};
node pre[150][150];
char mapp[150][150];
int d[150][150];
bool vis[150][150];
int dx[5]={0,1,0,-1},
dy[5]={1,0,-1,0};
int n,m;
void BFS()
{
memset(d,inf,sizeof(d));
queue<P> que;
que.push(P(0,0));
pre[0][0].x=-1;
pre[0][0].y=-1;
d[0][0]=0;
while(!que.empty())
{
P q=que.front();
que.pop();
for(int i=0; i<4; i++)
{
int nx=q.first+dx[i];
int ny=q.second+dy[i];
if(nx>=0 && nx<n && ny>=0 && ny<m && mapp[nx][ny]!='X')
{
if(mapp[nx][ny]=='.')
{
if(d[q.first][q.second]+1<d[nx][ny])
{
d[nx][ny]=d[q.first][q.second]+1;
pre[nx][ny].x=q.first;
pre[nx][ny].y=q.second;
que.push(P(nx,ny));
}
}
else
{
if(d[nx][ny]>d[q.first][q.second]+(mapp[nx][ny]-'0')+1)
{
d[nx][ny]=d[q.first][q.second]+(mapp [nx][ny]-'0')+1;
pre[nx][ny].x=q.first;
pre[nx][ny].y=q.second;
que.push(P(nx,ny));
}
}
}
}
}
}
//路径回溯
void prinpath(int s,int t)
{
if(pre[s][t].x==-1) return;
prinpath(pre[s][t].x,pre[s][t].y);
if(mapp[s][t]=='.')
printf("%ds:(%d,%d)->(%d,%d)
",d[s][t],pre[s][t].x,pre[s][t].y,s,t);
else
{
int num=mapp[s][t]-'0';
int k=d[s][t]-num;
printf("%ds:(%d,%d)->(%d,%d)
",k++,pre[s][t].x,pre[s][t].y,s,t);
for(int i=1; i<=num; i++)
printf("%ds:FIGHT AT (%d,%d)
",k++,s,t);
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(vis,0,sizeof(vis));
for(int i=0; i<n; i++)
{
scanf(" %s",mapp[i]);
}
BFS();
int ss=d[n-1][m-1];
if(ss==inf) printf("God please help our poor hero.
");
else{
printf("It takes %d seconds to reach the target position, let me show you the way.
",ss);
prinpath(n-1,m-1);
}
printf("FINISH
");
}
return 0;
}