码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 1026 Ignatius and the Princess I

时间:2014-08-20 19:39:12      阅读:248      评论:0      收藏:0      [点我收藏+]

标签:搜索

    题目大意:从(0, 0),走到(x-1, y-1)所需要的最短时间

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

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


    思路:

   

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

     广度优先遍历

     bubuko.com,布布扣      bubuko.com,布布扣

 

     由此可以算出最少的时间

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

     bubuko.com,布布扣     bubuko.com,布布扣

 

#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;
}


HDU 1026 Ignatius and the Princess I,布布扣,bubuko.com

HDU 1026 Ignatius and the Princess I

标签:搜索

原文地址:http://blog.csdn.net/u010499449/article/details/38709913

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!