您的位置:首页 > 其它

HDU 1026 Ignatius and the Princess I

2014-08-20 19:05 204 查看
题目大意:从(0, 0),走到(x-1, y-1)所需要的最短时间

(1)'.'为路需要1个单位的时间, 'X'不能走;

(2)为数字表示打怪需要的时间,而走到这一步需要1个单位的时间,所以 使用的时间 = 打怪时间 + 1

思路:

//数据1
5 6
.XX.1.
..X.2.
2...X.
...XX.
XXXXX.

广度优先遍历





由此可以算出最少的时间

又因为每一个点的时间都是由前一个点的时间得到的,所以这一个点有且只有前一个点,记录每一个点的前一个点





#include <iostream>
#include <queue>
#include <stack>
#include <cstdio>
using namespace std;
#define MAX 500
char m[MAX][MAX];
int v[MAX][MAX];
int x, y, flag;
int dx[]={0,0,-1,1};
int dy[]={1,-1,0,0};
struct Node
{
int x, y, num;
friend bool operator <(Node a, Node b)
{
return a.num > b.num;
}
};
Node pre[MAX][MAX];
int main()
{
int i, j;
Node tmp, s;
while (scanf("%d%d", &x, &y)!=EOF)
{
for (i=0; i<x; i++)
for (j=0; j<y; j++)
cin>>m[i][j];
flag = 0;
memset(v, 0, sizeof(v));
priority_queue<Node>q;
v[0][0] = 1;
pre[0][0].x = pre[0][0].y = -1;
tmp.x = tmp.y = 0;
tmp.num=0;
q.push(tmp);
while (!q.empty())
{
tmp = q.top();
q.pop();
if (tmp.x==x-1 && tmp.y==y-1)
{
printf("It takes %d seconds to reach the target position, let me show you the way.\n", tmp.num);
flag = 1;
break;
}
for (i=0; i<4; i++)
{
s.x = tmp.x + dx[i];
s.y = tmp.y + dy[i];
if (m[s.x][s.y]!='X' && s.x>=0 && s.y>=0 && s.x<x && s.y<y && !v[s.x][s.y])
{
if (m[s.x][s.y]=='.')
s.num = tmp.num + 1;
else
s.num = tmp.num + m[s.x][s.y] - '0'+1;
pre[s.x][s.y].y = tmp.y;
pre[s.x][s.y].x = tmp.x;
v[s.x][s.y] = 1;
q.push(s);
}
}
}
if (flag==1)
{
for (i=0; i<x; i++)
{
for (j=0; j<y; j++)
cout<<pre[i][j].x<<" "<<pre[i][j].y<<"     ";
cout<<endl;
}
stack<Node>sta;
s.x = x-1;
s.y = y-1;
sta.push(s);
while (s.x!=-1||s.y!=-1)
{
sta.push(pre[s.x][s.y]);
int tx = s.x, ty = s.y;
s.x = pre[tx][ty].x;
s.y = pre[tx][ty].y;
}
sta.pop();
s = sta.top();
sta.pop();
int time = 1;
while (!sta.empty())
{
tmp = sta.top();
sta.pop();
if (m[tmp.x][tmp.y]=='.')
{
printf("%ds:(%d,%d)->(%d,%d)\n", time,s.x, s.y, tmp.x, tmp.y );
time++;
}
else
{
printf("%ds:(%d,%d)->(%d,%d)\n", time,s.x, s.y, tmp.x, tmp.y );
time++;
for (i=0; i<m[tmp.x][tmp.y]-'0'; i++)
{
printf("%ds:FIGHT AT (%d,%d)\n", time, tmp.x, tmp.y);
time++;
}
}
s.x = tmp.x;
s.y = tmp.y;
}
}
else
printf("God please help our poor hero.\n");
printf("FINISH\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: