`
jacky
  • 浏览: 25341 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

死亡迷宫

阅读更多
引用

背景

很久以前,迷宫里住着一个恶魔。一天,我们伟大的英雄Jacky无意中踏入了这个迷宫。不幸的是,他被困在这个迷

宫当中了。恶魔在迷宫中召唤出了许多怪物,想要阻止Jacky逃脱。在迷宫中,Jacky遇到一个一位巫师。他给了

Jacky迷宫的地图,并告诉他迷宫的入口很快会关闭。Jacky必须以非常快的速度到达入口,并且有足够的力气推开挡

在入口的岩石。于是,Jacky带着地图一路向着出口走去……

问题

给出Jacky和各怪物的能量, 攻击力, 防御力,和迷宫的地图,请你计算一下 能量/耗时 的最大值。

当Jacky走到有怪物的地方时,Jacky会先进行攻击,然后怪物攻击,然后Jacky……当一方的能量小于等于0时攻击停止

,并且小于等于0的一方死亡。攻击时,每次对方损耗的能量为己方的攻击力减去对方的防御力。

当Jacky走到标有‘A’,‘B’,‘C’的地方时,Jacky的相应属性会得到增加。


对应关系如下:

[A] 能量 + P
[B] 攻击力 + Q
[C] 防御力 + R


如果耗时超过100,那么门将永远也打不开了,我们的Jacky也就永远的困在了这个暗无天日的迷宫之中……

输入

标准输入包含多组数据。

每组数据的第一行有六个整数W (1 <= W <= 20), H (1 <= H <= 20), P (1 <= P <= 10), Q (1<= Q <= 10), R (1

<= R <= 10), M (0 <= M <= 5). 迷宫是由一个W*H的矩形区域构成。M表示怪物的数量。
Jacky每个单位时间可以移动到相邻的4个格中,当然,必须得保证目标格在矩形区域中。默认的起始时间是0。
与怪物战斗不会花费额外的时间。

其后H行每行严格包含W个字符。用如下的各字符表示这个迷宫的地图:

[#]表示一堵墙(Jacky是不会穿墙术的)
[.] Marks an empty space, into which you can move.表示一块空地。
[S]表示Jacky的初始位置。
[E]表示迷宫的入口。
[0]数字表示各怪物的标号。
[A]表示属性增加地点。(使用次数仅限于一次)

其后一行有三个整数,表示Jacky的能量,攻击力,和防御力。

其后M行,每行有四个整数,表示怪物的编号,和这个怪物的各属性。

输出

对于每组输入数据,输出 能量/耗时 的最大值,并保留4位小数。如果Jacky不能到达出口,输出“impossible”。数

据之间无空行。

样例输入

6 17 7 5 4 3
#################
##E......#......#
#A#....#.0.##.#B#
#1###########2###
#.S............C#
#################
100 59 10
0 23 48 0
1 65 41 0
2 20 27 0

样例输出

3.7037



思路:
1:不是寻找最佳路径,只是模拟寻找路径过程。
2:杀死的怪物不能重生
3:简单起见,输入和输出没有按题目的要求。 输出的是Jacky探寻的路径和出来后的属性

###########################################
$MAZE_DATA = Array.[](['#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#'],
					  ['#','#','E','.','.','.','.','.','.','#','.','.','.','.','.','.','#'],
					  ['#','A','#','.','.','.','.','#','.','0','.','#','#','.','#','B','#'],
					  ['#','1','#','#','#','#','#','#','#','#','#','#','#','2','#','#','#'],
					  ['#','.','S','.','.','.','.','.','.','.','.','.','.','.','.','C','#'],
					  ['#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#'])
$MAZE_DATA_WIDTH = 17
$MAZE_DATA_HEIGHT = 6

$FACTOR_P = 7
$FACTOR_Q = 5
$FACTOR_R = 4
$FACTOR_M = 3	

$JACKY_DATA = Array.[](100,59,10)

$OGRE_DATA = Array.[]([23,48,0],[65,41,0],[20,27,0])

$TOTAL_TIME_LIMIT = 100		
$TIME_UNIT = 4  
				
##########################################	

$GRID_WALL = '#'
$GRID_EMPTY = '.'
$GRID_START = 'S'
$GRID_END = 'E'
$GRID_ATTRIBUTE = /[A-Z]/
$GRID_OGER = /\d/
$GRID_PASS = '~'

###########################################			

$ALL_PATHES = Array.[]()
$HAVE_OUT = false
###########################################


def walkToGrid(x,y,pathStack,detectedGrids)

	grid = gridData(x,y)

	return false if !grid || grid == $GRID_WALL || hasWalkTo(x,y,detectedGrids)
	
	#p "Walk to "+x.to_s+","+y.to_s+"   "
	
	detectedGrids.push([x,y])
	pathStack.push([x,y]) if !notWays(x,y,detectedGrids)
	
	
	if grid == $GRID_END
		pathStack.push([x,y])
		isOK = true		
	elsif grid =~ $GRID_ATTRIBUTE #meet something to eat ,become more strong
	
		p "Meet something to eat "
		$JACKY_DATA[0] += $FACTOR_P
		$JACKY_DATA[1] += $FACTOR_Q
		$JACKY_DATA[2] += $FACTOR_R
		
		setGridData(x,y,$GRID_EMPTY)
	elsif grid =~ $GRID_OGER # meet oger and fright
		ogerIndex = grid.to_i
		while true
			$OGRE_DATA[ogerIndex][0] -= $JACKY_DATA[1]-$OGRE_DATA[ogerIndex][2]#jacky attack first
			break if $OGRE_DATA[ogerIndex][0]<=0
			$JACKY_DATA[0] -= $OGRE_DATA[ogerIndex][1] - $JACKY_DATA[2]#oger attack 
			break if $JACKY_DATA[0]<=0
		end
		if $JACKY_DATA[0]<=0
			p "Jacky Dead !"
			exit
		else 
			p "Jacky kill oger [" + grid +"]"
			setGridData(x,y,$GRID_EMPTY) # clear the oger
		end
	end
		
	if !isOK		
		checkPreStep(pathStack,detectedGrids)	
		
		#check time 
		if detectedGrids.size/$TIME_UNIT >= $TOTAL_TIME_LIMIT 
			p detectedGrids
			p "Out of Time,man !"
			exit
		end
		
	else
		tmp = pathStack.clone		
		#save the success case to cache
		$ALL_PATHES << tmp	
		p "Find the outlet"	
		$HAVE_OUT = true
		return true
	end
			
	# The walking strategy is very important, but in here jacky could not to pick the best way because he doesn't know how to choice
	walkToGrid(x+1,y,pathStack,detectedGrids)	if !$HAVE_OUT
	walkToGrid(x-1,y,pathStack,detectedGrids)	if !$HAVE_OUT
	walkToGrid(x,y+1,pathStack,detectedGrids)	if !$HAVE_OUT
	walkToGrid(x,y-1,pathStack,detectedGrids)   if !$HAVE_OUT
			
end

def gridData(x,y)
	return nil if !validateXY(x,y)
	return $MAZE_DATA[y][x]
end

def setGridData(x,y,data)
	$MAZE_DATA[y][x]=data
end

def validateXY(x,y)
	return (x < $MAZE_DATA_WIDTH) && (x>=0) && (y<$MAZE_DATA_HEIGHT) && (y >=0)
end


# whether this position has any pathes to walk along
def notWays(x,y,detectedGrids)

	nextXGrid = gridData(x+1,y)
	preXGrid = gridData(x-1,y)
	nextYGrid = gridData(x,y+1)
	preYGrid = gridData(x,y-1)
	
	if !nextXGrid&&!preXGrid&&!nextYGrid&&!preYGrid
		return true
	end
	
	return (nextXGrid==$GRID_WALL || ((hasWalkTo(x+1,y,detectedGrids))&&!hasSuccesPathToGrid(x+1,y)))&&(preXGrid==$GRID_WALL || ((hasWalkTo(x-1,y,detectedGrids))&&!hasSuccesPathToGrid(x-1,y)))&&(nextYGrid==$GRID_WALL || (hasWalkTo(x,y+1,detectedGrids)&&!hasSuccesPathToGrid(x,y+1)))&&(preYGrid==$GRID_WALL || ((hasWalkTo(x,y-1,detectedGrids))&&!hasSuccesPathToGrid(x,y-1)))
		
end

def hasSuccesPathToGrid(x,y) 
	$ALL_PATHES.each{|path|
		path.each{ |grid|			
			return true if grid[0]==x && grid[1]==y
		}
	}
	return false
end

def hasWalkTo(x,y,detectedGrids)
	return false if !validateXY(x,y)
	detectedGrids.each{|grid|
		return true if grid[0]==x && grid[1] ==y
	}
	return false;
end

#check whether previous step is effective
def checkPreStep(pathStack,detectedGrids)
	return if pathStack.size<1
	ok = false
	while !ok
		preStep = pathStack.at(pathStack.size-1)	
		if notWays(preStep[0],preStep[1],detectedGrids)
			detectedGrids << pathStack.pop
		else
			ok=true			
		end
	end
	
	preStep = pathStack.at(pathStack.size-1)	
	lastDetectedGrid = detectedGrids.at(detectedGrids.size-1)	
	detectedGrids.push(preStep) if (lastDetectedGrid[0] != preStep[0] || lastDetectedGrid[1]!=preStep[1])

end

#get the start position and the end position
y=0
$MAZE_DATA.each{|y_data|	
	x=0
	y_data.each{|x_data|	
		if x_data==$GRID_START
			$START_X = x
			$START_Y = y			
		elsif x_data==$GRID_END
			$END_X = x
			$END_Y = y			
		end
		x += 1
	}
	break if $START_X&&$START_Y&&$END_X&&$END_Y
	y += 1
}


$detectedGrids = Array.new
walkToGrid($START_X,$START_Y,Array.[](),$detectedGrids)
p "----------- Walking Track-------------------"
p $detectedGrids
p $JACKY_DATA
分享到:
评论
2 楼 angge3 2012-08-07  
1 楼 gzw_02 2008-08-08  
大侠,我测试过你的程序好像问题不少,欢迎加我QQ讨论:472968118

相关推荐

    MUDDLE:多用户不和谐死亡迷宫体验

    混泥土多用户不和谐死亡迷宫体验当前的路线图是: 给玩家一个“攻击”和“防御”选项,并用几个简单的敌人填充迷宫使玩家能够用武器交换他们在地牢中发现的东西,并在地牢中填充一些武器宝藏扩展库存系统以允许装甲...

    迷宫小游戏

    这个小游戏是本人根据网上下的一个小游戏改编的.第二关和第三关没画墙(如果要画就调用SerStone(x,y)).由于本人初学MFC,还不会用多线程,打开背景音乐,会出问题.另外,有一个BUG,但本人找不到.希望熟悉MFC朋友能指点...

    QT Creator+Visual Studio 2015C#迷宫.7z

    这次得迷宫项目,本人使用QT Creator+Visual Studio 2015联合编译的,按照已给的算法去指定相对应的功能,获得一个目标奖励物品为完成项目中设定了终点旗帜,当人物到达旗帜就是完成游戏,获得胜利,根据鼠标得点击...

    dev-c++做的迷宫

    这个是用c++做的迷宫游戏,编译器是ISO C++14(gcc 9)。可以按wsad控制人物走动。#是墙;$是金币;X是怪物,碰到他就会死亡。

    mazegame:一个迷宫游戏,用于向大二新生教授Java

    英雄将在开始位置开始游戏,并且当英雄到达结束位置或死亡时游戏将结束。 迷宫是墙壁和空白空间的二维矩形阵列。 迷宫中的墙壁会阻止玩家直接直接到达终点位置。 空的空间可以容纳其他物体,例如终点位置,英雄,...

    DAMaze:为课程制作的小迷宫游戏数字音频导论

    玩家击中和死亡的声音: : 地精命中音效: : 地精区域音效: : Boss区音效: : Boss 命中音效: : //opengameart.org/content/random-sfx 开始游戏音效: ...

    labyrinth

    如果龙到达玩家的附近区域,则玩家死亡。 由于迷宫中是黑暗的,因此玩家只能看到3个单位距离处的相邻区域。 记录玩家解开迷宫的次数,如果他丧生,则将此数字连同他的名字一起保存到数据库中。 创建一个菜单项,该...

    Lost-Beneath-The-Surface:LD#29主题为“表面之下”的条目

    迷失在表面之下 ...不戴头盔就与恐怖分子相撞即刻死亡。 您会发现头盔散落在迷宫中。 每个迷宫都大于最后一个迷宫,并且是随机创建的。 迷宫生成代码不是我的。 使用Phaser框架制作。 &lt;3 执照 根据。

    Door to Life:具有永久死亡和程序生成关卡的冒险游戏。-开源

    开源冒险游戏,具有流氓般的元素,例如永久死亡和程序生成的地图。 迷宫是每个游戏随机生成的。 找到黄色的瓷砖赢得比赛。 具有Rogue元素(例如永久死亡和任意生成的地图)的开源冒险视频游戏。 每次玩游戏时都会...

    数据库课程设计

    数据库课程设计,死亡游戏,二叉树,交通咨询系统设计,迷宫设计

    神经死亡抑制剂对全脑缺血模型治疗作用的研究 (2006年)

    采用双侧颈总动脉结扎法建立小鼠全脑缺血再灌注模型,用避暗实验、Y型迷宫实验等行为学方法,及神经细胞的HE染色法研究神经死亡抑制剂(简称NDI)对于C57Black/6J小鼠全脑缺血30min后再灌注大脑海马区的影响。...

    pac-bar:MacBook Pro Touch Bar的吃豆人

    使用迷宫边缘的扭曲隧道在您和您的红色敌人之间保持一定距离,甚至可以逃脱某些死亡! 游戏玩法 注意:需要使用触控栏才能玩 游戏的目的是吃掉散落在迷宫中的所有点,但要注意:如果Blinky碰到您,游戏就结束了! ...

    cs499:最终的 cs499 项目

    如果敌人碰到吃豆人,就会失去一条生命,吃豆人本身也会枯萎死亡。 当所有生命都消失时,游戏结束。 默认情况下,吃豆人会获得 10,000 点的奖励生命。 ───▄████▄─────────────────── ...

    fa17-projet2:星期四第 1 组

    第 2 组 Caron Pierre-Edouard Vitse ... 玩家死亡导致与服务器断开连接。 (这部分需要团队3的工作和两个团队的协作) 从技术角度来看,编程是通过 Slick2d 库进行的,项目管理在 github 上完成参考教程 (Slick2D)

    Glorylab-开源

    3D多人死亡对战,剑,cross,钉头锤和魔法在活生生的迷宫中进行。

    elm-warrior:通过实施勇敢战士的人工智能来磨练你的榆树技能,命名为

    榆木战士 在这款游戏中,您可以通过编程一位勇敢的战士的 AI 来磨练自己的 Elm 技能,该战士在迷宫中穿行并与危险的对手作战。 你可以在这里找到实现你的战士所需的文档,但为了快速开始,我建议你克隆 。 您也可以...

    mortalCoil:简单逻辑的浏览器游戏

    死亡缠绕在迷宫中找到自己的路。 选择一个起点,然后选择一个行走方向,直到撞墙。 填满整个板子以进入下一个级别!

    java坦克大战源码下载-csci205finalProject:csci205的最终项目,包括交互式2d坦克视频游戏

    名玩家控制的坦克发生碰撞,或者由于某种原因,他们同时死亡,则游戏以平局结束。 怎么玩 当应用程序启动时,游戏菜单出现,带有背景音乐和用户可以选择的四个按钮:单人游戏、两人游戏、设置菜单或说明菜单。 如果...

    java坦克大战源码下载-Tanks2D:为巴克内尔大学的软件工程与设计课程设计和开发的Tanks2D是一款交互式视频游戏,用户可以在其中控制

    名玩家控制的坦克发生碰撞,或者由于某种原因,他们同时死亡,则游戏以平局结束。 怎么玩 当应用程序启动时,游戏菜单出现,带有背景音乐和用户可以选择的四个按钮:单人游戏、两人游戏、设置菜单或说明菜单。 如果...

    CURSOR.RPG-based-on-Nick-app

    优秀的RPG角色扮演我们必须与迷宫中的怪物作战。 为此,我们需要一个由三个角色组成的团队,其中一个是领导者。 如果领导者死亡或我们发现特殊物品“大水晶”,游戏将结束。 该团队可以从三个种族的角色中选出:精灵...

Global site tag (gtag.js) - Google Analytics