Befunge, 344 байт
&v>>>#p_:63p:43g`\!+v>/*53g+\01g:2%2*1-\2/!*63g+\0\:v
40$ v++!\`g14:p35:\<^2\-1*2%2p10::%4+g00:\g36\g35-1_v
#11^$_83p73v >1+:41g`!#v_$,1+:43g`!#v_@>->2>+00p+141^_
<p1^ vp< ^,g+7g36:<<<<1+55p36:<<<< ^1?0^#7g36g35*
8&p|!++!%9#2g+7g10\*!-g38g10!-g37:g00!!*<>3^
443>:!#v_>>1-::3%1-:53g+00p\3/1-:63g+01p^
^>^>>$#<"#"53g63g7+p41g53g-43g63g-+!#^_
Спробуйте в Інтернеті!
Як зазначає @flawr у своїй відповіді MATLAB, це може зайняти деякий час, якщо розмір поля має будь-який нетривіальний розмір. Насправді досить легко потрапити в ситуацію, коли насправді не варто намагатися чекати, коли це закінчиться, адже ти, швидше за все, чекаєш кінця часу.
Щоб зрозуміти, чому це відбувається, корисно переглянути програму, як вона виконується в одному з багатьох "візуальних налагоджувачів" Befunge. Оскільки дані та код - це одне і те ж саме в Befunge, ви зможете переглянути шлях, який змінюється з часом. Наприклад, ось коротка анімація, яка показує, як може виглядати частина пробігу по повільному шляху.
Після того, як алгоритм вирішив зробити цей доленосний поворот ліворуч у нижній частині поля поля, він по суті засудив себе на життя безцільного блукання. З цього моменту він повинен пройти кожен можливий шлях у відгородженій ділянці, перш ніж він зможе відступити назад і спробувати повернути праворуч. А кількість потенційних шляхів у цих випадках може легко стати астрономічною.
Підсумок: Якщо, здається, це зайняло тривалий час, можливо, це гарна ідея просто перервати виконання та почати заново.
Пояснення
Це в основному рекурсивний алгоритм, намагаючись провести всі можливі шляхи через поле, а потім розмотувати кроки, які вже були виконані, коли воно застрягає. Оскільки у Befunge відсутня концепція функцій, рекурсивна функція не виникає, але ми можемо наслідувати процес, відстежуючи стан на стеку.
Це працює, заповнюючи стек потенційними координатами, які ми, можливо, захочемо слідувати. Потім витягуємо один набір зі стека і перевіряємо, чи він підходить (тобто в діапазоні, а не перетинається з існуючим контуром). Як тільки ми знайдемо гарне місце, ми #
записуємо на поле для гри в цьому місці і додаємо ці деталі до стеку на випадок, якщо нам потрібно буде відслідковувати пізніше.
Потім ми натискаємо на стек додаткові чотири набори координат (у випадковому порядку) із зазначенням потенційних шляхів, які ми можемо взяти з цього нового місця, і переходимо до початку циклу. Якщо жоден із потенційних шляхів неможливий, ми дістанемося до точки на стеці, де ми зберегли місце розташування#
нами, тому ми скасуємо цей крок і продовжимо пробувати потенційні координати від одного кроку до цього.
Ось як виглядає код із виділеними різними компонентами:
Прочитайте ширину та висоту поля та натисніть на початкові координати разом із 0
маркером типу, щоб вказати потенційний шлях, а не місце відстеження.
Перевірте наявність місць зворотного відстеження (позначених 1
маркером типу), які повертаються за допомогою простої p
команди, оскільки вони зберігаються у точному форматі, необхідному для запису місця на поле для відтворення.
Перевірте, чи все ще є координати всередині ігрового поля. Якщо вони перебувають поза діапазоном, скиньте їх із стека та петлі назад, щоб спробувати наступні потенційні координати. Перевірте, чи будуть координати контактувати з існуючим відрізком шляху. Місце попереднього кроку, очевидно, ігнорується з цієї перевірки. Якщо всі тести успішні, напишіть а
Якщо вони знаходяться в діапазоні, отримайте наступні два значення зі стека, що є місцем попереднього кроку (необхідного в тесті, який слід за цим).
#
на ігрове поле і перевірте, чи ми дійшли до місця призначення.
Якщо у нас є, випишіть остаточний шлях та вийдіть.
В іншому випадку збережіть координати на стеці 1
маркером типу для подальшого зворотного відстеження.
Це переривається випадковим підрахунком чисел, який нам знадобиться незабаром. Поверніться до початку основного циклу і обробіть наступні значення на стеку.
Натисніть чотири потенційні пункти, до яких можна дістатися з поточного місця розташування. Випадкове число визначає порядок, в якому вони висуваються, і, таким чином, порядок їх дотримання.