Негідний шлях
Вашим завданням буде, даючи двовимірний масив описаних нижче елементів, що представляє підземелля, вивести або повернути одне число, що представляє кількість золотих шматочків, які мошеник може зібрати, не пробуджуючи жодних монстрів.
Елементи масиву такі:
- Порожні пробіли представлені або
.
або пробілом, і ваш дзвінок; - Вихідна позиція 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)
все одно це рішення.
@
дійсним входом?