题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1026;
题意:给你一个地图,上面有障碍和怪兽,障碍不可以走,怪兽有hp值,每点hp有消耗一秒时间去攻击,起点在(0,0),终点在
(n-1, m-1),还要把路径输出.
#include<iostream>
#include<algorithm>
#include<map>
#include<cstring>
#include<queue>
#include<set>
#include<cstdio>
#include<cmath>
#include<stack>
using namespace std;
int n, m, run[][2] = {1, 0, 0, 1, -1, 0, 0, -1};
const int N = 1e2 + 17;
int vis[N][N];
struct node
{
int x, y, t;
bool operator < (const node &a) const //重载小于号运算符
{
return t > a.t;
}
};
node root[N][N];//前驱节点
char Map[N][N];
bool yes(node a)
{
if(a.x<0||a.x>n-1||a.y<0||a.y>m-1||Map[a.x][a.y] == 'X'||vis[a.x][a.y])
return false;
return true;
}
int bfs()
{
for(int i = 0; i < n; i ++)
for(int j = 0; j < m; j ++)
root[i][j].x = root[i][j].y = root[i][j].t = -1;
priority_queue<node>q;
node in, out;
in.x = 0, in.y = 0, in.t = 0;
if(Map[0][0]>='0' && Map[0][0]<='9')
in.t = Map[0][0] - '0';
root[0][0].x = -1 , root[0][0].y = -1;
q.push(in);
vis[0][0] = 1;
while(!q.empty())
{
in = q.top();
q.pop();
if(in.x == n-1 && in.y == m-1)
{
return in.t;
}
for(int i = 0; i<4; i++)
{
out.x = in.x + run[i][0];
out.y = in.y + run[i][1];
if(yes(out))
{
if(isdigit(Map[out.x][out.y]))
out.t = Map[out.x][out.y] - '0' + in.t + 1;
else
out.t = in.t + 1;
vis[out.x][out.y] = 1;
root[out.x][out.y] = in;
root[out.x][out.y].t = out.t;
q.push(out);
}
}
}
return 0;
}
int main()
{
while(~scanf("%d%d", &n, &m))
{
memset(vis, 0, sizeof(vis));
for(int i = 0; i<n; i++)
for(int j = 0; j<m; j++)
scanf(" %c", &Map[i][j]);
int ok = bfs();
if(!ok)printf("God please help our poor hero.\n");
else
{
printf("It takes %d seconds to reach the target position, let me show you the way.\n", ok);
node r;
r.x = n-1, r.y = m-1;
stack<node>st;//用一个栈来保存路径
while(root[r.x][r.y].x!= -1 || root[r.x][r.y].y != -1)
{
st.push(r);
r = root[r.x][r.y];
}
node shit;
int t = 1;
shit = st.top();
if(isdigit(Map[0][0]))
for(int i = 1; i<=Map[0][0] - '0'; i++)
printf("%ds:FIGHT AT (0,0)\n", t++);
while(st.size())
{
shit = st.top();
st.pop();
node cc = root[shit.x][shit.y];
printf("%ds:(%d,%d)->(%d,%d)\n", t++, cc.x, cc.y, shit.x, shit.y);
if(isdigit(Map[shit.x][shit.y]))
{
int fuck = Map[shit.x][shit.y] - '0';
for(int i = 1; i<=fuck; i++)
printf("%ds:FIGHT AT (%d,%d)\n", t++, shit.x, shit.y);
}
}
}
printf("FINISH\n");
}
return 0;
}