`

HDU 1072 Nightmare .

阅读更多
Nightmare
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2506    Accepted Submission(s): 1248



Problem Description
Ignatius had a nightmare last night. He found himself in a labyrinth with a time bomb on him. The labyrinth has an exit, Ignatius should get out of the labyrinth before the bomb explodes. The initial exploding time of the bomb is set to 6 minutes. To prevent the bomb from exploding by shake, Ignatius had to move slowly, that is to move from one area to the nearest area(that is, if Ignatius stands on (x,y) now, he could only on (x+1,y), (x-1,y), (x,y+1), or (x,y-1) in the next minute) takes him 1 minute. Some area in the labyrinth contains a Bomb-Reset-Equipment. They could reset the exploding time to 6 minutes.

Given the layout of the labyrinth and Ignatius' start position, please tell Ignatius whether he could get out of the labyrinth, if he could, output the minimum time that he has to use to find the exit of the labyrinth, else output -1.

Here are some rules:
1. We can assume the labyrinth is a 2 array.
2. Each minute, Ignatius could only get to one of the nearest area, and he should not walk out of the border, of course he could not walk on a wall, too.
3. If Ignatius get to the exit when the exploding time turns to 0, he can't get out of the labyrinth.
4. If Ignatius get to the area which contains Bomb-Rest-Equipment when the exploding time turns to 0, he can't use the equipment to reset the bomb.
5. A Bomb-Reset-Equipment can be used as many times as you wish, if it is needed, Ignatius can get to any areas in the labyrinth as many times as you wish.
6. The time to reset the exploding time can be ignore, in other words, if Ignatius get to an area which contain Bomb-Rest-Equipment, and the exploding time is larger than 0, the exploding time would be reset to 6.




Input
The input contains several test cases. The first line of the input is a single integer T which is the number of test cases. T test cases follow.
Each test case starts with two integers N and M(1<=N,Mm=8) which indicate the size of the labyrinth. Then N lines follow, each line contains M integers. The array indicates the layout of the labyrinth.
There are five integers which indicate the different type of area in the labyrinth:
0: The area is a wall, Ignatius should not walk on it.
1: The area contains nothing, Ignatius can walk on it.
2: Ignatius' start position, Ignatius starts his escape from this position.
3: The exit of the labyrinth, Ignatius' target position.
4: The area contains a Bomb-Reset-Equipment, Ignatius can delay the exploding time by walking to these areas.




Output
For each test case, if Ignatius can get out of the labyrinth, you should output the minimum time he needs, else you should just output -1.




Sample Input
3 3 3 2 1 1 1 1 0 1 1 3 4 8 2 1 1 0 1 1 1 0 1 0 4 1 1 0 4 1 1 0 0 0 0 0 0 1 1 1 1 4 1 1 1 3 5 8 1 2 1 1 1 1 1 4 1 0 0 0 1 0 0 1 1 4 1 0 1 1 0 1 1 0 0 0 0 3 0 1 1 1 4 1 1 1 1 1



Sample Output
4 -1 13 尼条题目大意就系一个人入左去一个迷宫之后,就触发左一个定时6分钟geBoom。距要尽力跑到出口。迷宫有起点(2),空地(1),墙(0),Boom重置器(4)【定时Boom重置为6】,出口(3)。并有如下规则:1、每分钟,条牟利剩系可以走上下左右四个相邻ge格,并且每步要行一分钟。(唔知系个人行得慢剩系d格太大)2、如果行到出口ge时候,倒计时又到左0,呢个人就钉柴。3、如果行到重置器ge时候,倒计时又到左0,呢个人都系钉柴。4、每个格都可以重复行,(姐系可以无限重置都得,就系用尼条规则剪枝)。 我用左广搜+比较按剩余时间剪枝。
下面结合代码解释: HDU 1072 0ms 276K 1275B SGetEternal{(。)(。)}!

#include<iostream> 
#include<queue> 
using namespace std; 
#define INFI (1<<31)-1   

struct point //队列类型,step储存步数。 
{  
	int x,y,step;  
	void set(int a,int b,int c) 
	{ x=a; y=b; step=c; }
}

int main() 
{  
	int t,n,m,i,j,hx,hy,x,y,mn;  
	char map[10][10];  
	int tim[10][10]; //储存点(i,j)当前时间  
	char move[4][2]={0,1,1,0,0,-1,-1,0};  
	queue<point> que;  
	
	scanf("%d",&t);  
	while (t--)  
	{  
		hx=hy=0;   
		scanf("%d%d",&n,&m);   
		for (i=0;i<=m+1;i++)    
			map[0][i]=map[n+1][i]=0;    //设置出界墙,即系系将迷宫外部加墙   
		for (i=1;i<=n;i++)   
		{    
			map[i][0]=map[i][m+1]=0;    //设置出界墙too    
			for (j=1;j<=m;j++)    
			{     
				tim[i][j]=0;     
				scanf("%d",&map[i][j]);     
				if (map[i][j]==2) 
				{ tim[i][j]=6; hx=i; hy=j; } //起始点剩余时间为6   
			}  
		}  
		mn=INFI;   
		h.set(hx,hy,0);   
		que.push(h);   
		while (!que.empty())  
		{    
			temp=que.front();   
			if (map[temp.x][temp.y]==3 && mn>temp.step)   
			{     mn=temp.step;     h.step=temp.step;    }   
			for (i=0;i<4 && tim[temp.x][temp.y]-1;i++)    
			{    
				x=temp.x+move[i][0];    
				y=temp.y+move[i][1];    
				if (map[x][y]!=0 && tim[x][y]<tim[temp.x][temp.y]-1) //&& 后面就系时间剪枝,当当前点剩余时间-1多余下一点时先行,防回荡,可以自己举例。    
				{      
					tim[x][y]=tim[temp.x][temp.y]-1;      
					if (map[x][y]==4) tim[x][y]=6;     
					in.set(x,y,temp.step+1);    
					que.push(in);     
				}   
			}   
			que.pop();   
		}   
		if (mn<INFI) printf("%d",h.step);  
		else printf("-1");   
		putchar('/n'); 
	} 
	return 0;
} 

精粹就系时间剪枝,吾剪就超时,差好hi远。9up完毕……
分享到:
评论

相关推荐

    杭电操作系统实验 HDU操作系统实验.zip

    杭电操作系统实验 HDU操作系统实验.zip杭电操作系统实验 HDU操作系统实验.zip杭电操作系统实验 HDU操作系统实验.zip杭电操作系统实验 HDU操作系统实验.zip杭电操作系统实验 HDU操作系统实验.zip杭电操作系统实验 HDU...

    ACM.zip_visual c

    "HDU1072 Nightmare.cpp"可能涉及到深度优先搜索在解决复杂问题中的应用,如梦境解析;"HDU1016 Prime Ring Problem.cpp"可能使用了BFS寻找素数环;"HDU1015 Safecracker.cpp"可能通过BFS算法破解密码锁;"HDU1238 ...

    大学期间操作系统实验-HDU操作系统实验.zip

    HDU操作系统实验.zip大学期间操作系统实验-HDU操作系统实验.zip大学期间操作系统实验-HDU操作系统实验.zip大学期间操作系统实验-HDU操作系统实验.zip大学期间操作系统实验-HDU操作系统实验.zip大学期间操作系统实验-...

    HDU_2010.rar_hdu 2010_hdu 20_hdu acm20

    【标题】"HDU_2010.rar"是一个压缩包文件,其中包含了与"HDU 2010"相关的资源,特别是针对"HDU ACM20"比赛的编程题目。"hdu 2010"和"hdu 20"可能是该比赛的不同简称或分类,而"hdu acm20"可能指的是该赛事的第20届...

    hdu.rar_HDU 1089.cpp_OJ题求和_hdu_horsekw5_杭电obj

    【标题】"hdu.rar_HDU 1089.cpp_OJ题求和_hdu_horsekw5_杭电obj" 提供的信息是关于一个压缩文件,其中包含了一个名为 "HDU 1089.cpp" 的源代码文件,这个文件是为了解决杭州电子科技大学(Hangzhou Dianzi ...

    hdu 乒乓 裁判.rar

    标题中的“hdu 乒乓 裁判.rar”暗示了这是一个关于乒乓球裁判知识的压缩文件,可能包含了关于乒乓球比赛规则、裁判工作、器材发展以及赛事组织等方面的信息。描述中的“hdu 乒乓 裁判”进一步确认了主题,表明内容...

    HDU——ACM.zip

    【HDU——ACM.zip】压缩包文件是一个专门为准备ACM(国际大学生程序设计竞赛)集训而设计的资源集合,包含了多个关键算法领域的详细讲解。这个资源包旨在帮助参赛者提升算法理解与编程能力,涵盖了多项在算法竞赛中...

    hdu_ACM.rar_ACM_hdu_hdu acm_hdu_ACM_杭电ACM

    杭电hdu acm资料所用杭电的acm题

    期末复习自行整理资料分享_HDU-fuxiziyong.zip

    期末复习自行整理资料分享_HDU-fuxiziyong

    杭电期中期末复习资料档案库_HDU_QuickLearner.zip

    杭电期中期末复习资料档案库_HDU_QuickLearner

    ACM HDU题目分类

    ACM HDU 题目分类 ACM HDU 题目分类是指对 HDU 在线判题系统中题目的分类,总结了大约十来个分类。这些分类将有助于编程选手更好地理解和解决问题。 DP 问题 DP(Dynamic Programming,动态规划)是一种非常重要...

    samcat2021#ZXBlog#Hdu - 1711. Number Sequence以及KMP算法总结1

    next[i]的含义是在str[i]之前的字符串str[0...i]中,必须以str[i-1]结尾的后缀子串(不能包含str[0])与必须以str[0]开头的前

    liudongjun-hdu.github.io

    【标题】"liudongjun-hdu.github.io" 指的是一个个人或者组织在GitHub上托管的网页项目,可能是个人博客、技术分享站点或者其他类型的Web应用。这种名称通常是GitHub Pages的格式,其中"liudongjun-hdu"可能是用户或...

    HDU.rar_hdu_hdu07_com_shownv9b_www.563hdu.

    【标题】"HDU.rar_hdu_hdu07_com_shownv9b_www.563hdu." 暗示这是一个与HDU(杭州电子科技大学在线编程平台)相关的压缩包,其中可能包含了该平台上的编程竞赛题目或练习题目的源代码。"hdu07"可能是某个特定题目的...

    hdu5102.zip_K.

    标题中的"hdu5102.zip_K."暗示这是一个与编程竞赛相关的题目,通常在HDU(杭州电子科技大学)在线判题系统中出现。这个题目可能是一个编程挑战,要求参赛者解决一个特定的问题,并提交源代码以供自动评判。"K."可能...

    hdu.rar_hdu

    "hdu.rar_hdu"这个压缩包文件很可能是某位程序员整理的他在HDU上解决过的题目代码集合。这些代码通常包含了对各种算法的应用,例如排序、搜索、图论、动态规划等,对于学习算法和准备编程竞赛的初学者来说是一份宝贵...

    hdu动态规划算法集锦

    题目链接:[Robberies](http://acm.hdu.edu.cn/showproblem.php?pid=2955) - **问题描述**:这是一道典型的0-1背包问题变种,考虑如何最大化抢劫金额,且不会被抓住。 - **解题思路**: - 定义状态$f[j]$表示在第$...

    hdu3398.zip_visual c

    【标题】:“hdu3398.zip_visual c”指的是一个使用Visual C++编写的解决方案,针对HDU(杭州电子科技大学)在线评测系统中的3398号问题。这个压缩包可能包含了完整的源代码、编译配置和其他相关资源,帮助用户理解...

    HDU题库.zip

    HDU题库.zip是一个压缩包文件,包含了从1000到6543号的所有HDU(杭州电子科技大学在线编程平台,也被称为HDU Online Judge)编程竞赛题目。这个资源对于学习算法、提高编程技能以及准备各类编程竞赛的用户来说极其...

Global site tag (gtag.js) - Google Analytics