hdu2425解题报告

题意很明了,就是找起点到终点的最短用时,但是因为每种不同的地带,用时不同,那么这里可以用到优先队列,来处理总共用时,我们每次总是把用时最短的坐标点出队,访问四周,那么,就总能选择用时最短的去走,直到达到目的地:

上马:

0MS244K

#include<cstdio>
#include<queue>
using namespace std;
#define MAX 22

struct node
{
	int x,y,time;//坐标,以及起点到此点的用时
	bool operator <(const node &N)const//用优先队列,按用时从小到大排序
	{
		return N.time<time;
	}
}st;//开始点

int R,C;//行列
int endx,endy;//目标的坐标
char map[MAX][MAX];
int T[3];//对于三种不同地带的用时

void Input()
{
	int i;
	scanf("%d%d%d",&T[0],&T[1],&T[2]);
	for(i=0;i<R;i++,getchar())
		scanf("%s",map[i]);
	scanf("%d%d%d%d",&st.x,&st.y,&endx,&endy);
	st.time=0;
}

int vis[4][2]={{-1,0},{1,0},{0,1},{0,-1}};

int bfs()
{
	priority_queue<node>q;
	map[st.x][st.y]='@';//走过了的地方我们就标记为石头,不再走
	q.push(st);

	while(!q.empty())
	{
		node pre=q.top();q.pop();
		if(pre.x==endx && pre.y==endy)
		{
			return pre.time;
		}
		for(int i=0;i<4;i++)
		{
			node p;
			p.x=pre.x+vis[i][0];
			p.y=pre.y+vis[i][1];
			p.time=pre.time;
			if(p.x>=0 && p.y >= 0 && p.x < R && p.y < C && map[p.x][p.y]!='@')//对于地图中不是石头的地方访问
			{
				if(map[p.x][p.y]=='T')p.time+=T[2];//这里看看是哪一种地带,
				else if(map[p.x][p.y]=='.')p.time+=T[1];
				else if(map[p.x][p.y]=='#')p.time+=T[0];
				map[p.x][p.y]='@';
				q.push(p);
			}
		}
	}
	return -1;//走不到返回-1
}

int main()
{
	int cas=1;
	while(~scanf("%d%d",&R,&C))
	{
		Input();
		printf("Case %d: %d\n",cas++,bfs());
	}
	return 0;
}
个人愚昧观点,欢迎指正和交流

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值