流氓寻路
给定下面描述的元素的二维数组(表示地牢),您的任务将输出或返回一个数字,该数字表示流氓可以在不唤醒任何怪物的情况下收集的金块数量。
数组的元素如下:
- 空格由
.
您的呼叫或一个空格表示; - 当然,Rogue的起始位置由
@
; 表示。 - 一块金代表
$
; - 墙壁用
#
; - 怪物由以下正则表达式中的字符表示:
[a-zA-Z*&]
。
该数组不应包含上面未列出的任何字符,因此您可以假定不是墙壁,空白空间,流氓或金币的任何东西都是怪兽。
寻路的规则是:
- 流氓只能穿过空的牢房或含金的牢房。
- 转向到相邻或对角线相邻的单元格;
- 拿起黄金是立即的;
- 流氓在不醒来的情况下不能与怪物相邻或对角相邻超过一个回合,这是被禁止的;
- 流氓可以多次进入怪物的意识区域,只有流氓在其附近连续走两圈时,怪物才会醒来。
输入和输出规则
您可以采用任何合理的格式获取输入,包括二维数组,平面数组,字符串或其他任何格式。如果它使您的生活更轻松,那么您也可以考虑数组的尺寸。
可以确保流氓一开始不会在怪物附近。
完整的程序或功能很好。
计分
这是代码高尔夫球,分数是提交的字节数,越少越好。
测试用例
为了方便阅读,我在此处使用空格表示点,如果您愿意,可以使用空格(请参见上文)。还要注意,这纯粹是偶然的,流氓总是在左上角,您的代码也应该处理任何其他有效位置。
1)
@..
.$.
... -> 1
只是一个健康测试。
2)
@....
...g$
..... -> 0
再次进行健全性测试。
3)
@....
...$g
..... -> 1
流氓可以通过向左移动来抢金。
4)
@....g..
.......$
........
.....h.. -> 1
流氓可以在两个怪物之间作曲折曲折,每个怪物之间的停留时间不得超过一圈。
5)
@....z..
.......$
.....b.. -> 0
先前测试用例的策略在这里不起作用-怪物敏感区域重叠。
6)
@$#.
###$
.... -> 1
健全性测试。
7)
@..#..
$.$g.$
...#.. -> 2
同上。
8)
@#.d#$
$...##
e.....
..$...
##..$b
.#..g$ -> 3
在这里的所有黄金中,只能安全地到达三个:通过向下移动一个然后返回到起始位置,可以获得接近起始位置的黄金。为了从左上角逃脱,流氓必须向右下斜对角移动两次。中间的黄金不构成挑战。可以通过从中间金的右边对角向内移动然后向后移动来获得g
和保护的外部金b
。其余的无法获得:右上角的黄金被墙壁挡住,右下角的黄金需要在怪物敏感性区域内转两圈。
以下测试用例由mbomb007慷慨捐赠。
9)
12345678
a @....g.D
b .......$
c ......#.
d .....h.. -> 1
这是一个棘手的问题。路径是b4-b5-c6-b7-c8-b8(grab)
。
10)
12345678
a @....g.D
b .......$
c .......#
d .....h.. -> 1
路径是[bc]4-c5-b6-c7-b8(grab)
。
11)
12345678
a @....g.D
b ......#$
c .......#
d .....h.. -> 1
多余的墙实际上没有任何改变,[bc]4-c5-b6-c7-b8(grab)
仍然是一种解决方案。
@
是有效输入吗?