qduoj 帅气的HYC与冰淇淋

帅气的HYC与冰淇淋

发布时间: 2015年11月1日 17:02   最后更新: 2015年11月3日 00:14   时间限制: 1000ms   内存限制: 128M

炎热的夏天,帅气的HYC要请整个实验室吃冰淇淋,于是……HYC顶着那炎炎的烈日,向Ice-cream home走去……

可是……停电了……

冰淇淋们躺在Ice-cream home的冰柜里,慢慢地……慢慢地……融化…………

你说,帅气的HYC能赶在冰淇淋融化完之前赶到Ice-cream home去吗?

给你一张坐标图,s为HYC的初始位置,m为Ice-cream home的位置,‘.’为路面,HYC在上面每单位时间可以移动一格;‘#’为草地,HYC在上面每两单位时间可以移动一格(;‘o’是障碍物,HYC不能在它上面行动。也就是说,HYC只能在路面或草地上行走,必须绕过障碍物,并到达冰淇淋店。但是…………不保证到达时,冰淇淋还未融化,所以……就请聪明的你……选择最佳的方案啦…………如果,HYC到的时候,冰淇淋已经融化完了,那他可是会发狂的。

依次输入冰淇淋的融化时间t(0<t<1000),坐标图的列x,行y(5<=x,y<=25){太长打起来好累……},和整张坐标图。

判断按照最优方案是否可以赶在冰淇淋融化之前到达冰淇淋店(注:当t=最优方案所用时间,则判断为未赶到),如赶到,输出所用时间;如未赶到,输出HYC的怒吼——“ouhouhouhou”(不包括引号)。

  复制
11 
10 
8 
......s... 
.......... 
#ooooooo.o 
#......... 
#......... 
#......... 
#.....m... 
#.........
10
优先队列加bfs模板题,每次出队出时间最少的

#include<stdio.h>
#include<queue>
#include<functional>
#include<vector>
#include<string.h>
using namespace std;
char map[100][100];
int go[4][2]={1,0,-1,0,0,1,0,-1};
int n,m,t;
struct node
{
	int x;
	int y;
	int time;
	bool operator<(const struct node &a) const
	{
		return time>a.time;
	}
};
int check(node r)
{
	if(r.x<0||r.x>=n||r.y<0||r.y>=m||map[r.x][r.y]=='o')
	return 1;
	return 0;
}
int bfs(int x,int y)
{
	struct node re,pe;
	priority_queue <struct node> q;
	re.x=x;
	re.y=y;
	re.time=0;
	map[re.x][re.y]='o';
	q.push(re);
	while(!q.empty())
	{
		pe=q.top();
		q.pop();
		if(pe.time ==t)
		return 1;
		for(int i=0;i<4;i++)
		{
			re=pe;
			re.x+=go[i][0];
			re.y+=go[i][1];
			if(check(re))
			continue;
			if(map[re.x][re.y]=='m')
			{
				if(re.time+1==t)
				continue;
				printf("%d\n",re.time+1);
				return 0;
			}
			re.time++;
			if(map[re.x][re.y]=='#')
			re.time++;
			if(re.time>=t) continue;
			map[re.x][re.y]='o';
			q.push(re);
		}
	}
	return 1;
}
int main()
{
	int i,j,tx,ty;
	while(~scanf("%d",&t)){
	//	getchar();		
		scanf("%d%d",&m,&n);
     	//printf("%d%d%d",t,m,n);
		getchar();
		for(i=0;i<n;i++)
		scanf("%s",map[i]);
		for(i=0;i<n;i++)
		{
			for(j=0;j<m;j++)
			{//printf("%c",map[i][j]);
				if(map[i][j]=='s')
				{
					tx=i;
					ty=j;
				}
			}
		//	printf("\n");
		}
		
		if(bfs(tx,ty))
		printf("ouhouhouhou\n");
	}
	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值