Допоможіть розробити найновішу головоломку Альфіса!


16

Алфіс, королівський вчений підпілля, закінчив прототип нового головоломки. Однак вона, схоже, не може знайти когось, хто бажає перевірити це.

Правила її головоломки такі:

Мета полягає в тому, щоб дістатися до правого боку, починаючи від самої центральної плитки з лівого боку. Для головоломок з парними висотами почніть з нижньої частини двох плиток. (Приклади. У нульовому індексованому масиві 4x4 початковою позицією було б [2,0] - рядок 2, стовпець 0. У нульовому індексованому масиві 5х5 початкове положення було б [2,0] - рядок 2, стовпець 0.)

Кожна кольорова плитка має свою "садистську" функцію:

  • Рожеві та зелені плитки (представлені як "P" і "G") нічого не роблять
  • Червона та жовта плитка ("R", "Y") непрохідна.
  • Помаранчева плитка ("O") робить програвача запахом, як апельсини
  • Фіолетові плитки ("U") примушують гравця до наступної плитки в напрямку, до якого вони стикаються, і змушують їх пахнути лимонами
  • Синя плитка ("В") є прохідною до тих пір, поки гравець не пахне апельсинами.

Щоб уточнити механіку аромату, запах гравця буде зберігатися нескінченно або до тих пір, поки не перекриє плитку різного запаху, тобто якщо гравець наступить на помаранчеву плитку, він буде пахнути апельсинами, поки не наступить на фіолетову плитку.

Крім того, жовта плитка, розміщена вертикально або горизонтально, що прилягає до синьої плитки, також призведе до того, що синя плитка стане непрохідною.


Ваше завдання - написати програму або функцію, яка приймає двовимірний масив символів (або 1D рядковий масив, або якийсь інший правильний формат), що представляє макет головоломки як вхідний і виводить як оригінальну головоломку, так і розв’язану головоломку, зірочками чи деякими інший символ, що показує правильний шлях. Припустимо, що задана головоломка вирішується.

Використовуйте цю головоломку як приклад:

BGYBG
PGPBG
PUBPB
OUGYB
PPOPP

Ваша програма виводить:

BGYBG
PGPBG
PUBPB
OUGYB
PPOPP

BGYBG
PGPBG
*****
OUGYB
PPOPP

Будь-яка використовувана головоломка повинна бути створена за допомогою цього .

Діють стандартні правила гольф-коду. Найкращі відповіді будуть найкоротшими для кожної мови. Відповіді повинні містити мову, кількість байтів та три тестові справи. Перші два можуть бути будь-яким макетом, який ви обрали, але третій повинен бути:

RRRR
RPPR
PUOR
RPBP

Пропонований тестовий випадок: RRRR | RPPR | ПУОР | RPBP. Якщо я не помилився, для цього потрібно двічі перейти плитку U. Також я не впевнений у поведінці U, коли плитка після неї є непрохідною, ти все ще можеш ходити на U або ти не можеш цього зробити?
FryAmTheEggman

@FryAmTheEggman Якщо плитка після плитки U непрохідна, ви не можете ходити по плитці U в цьому напрямку.
EnragedTanker

@TimmyD Зрозуміло, я цього не помічав, коли вперше робив цю головоломку.
EnragedTanker

@crayzeedude Я думаю, що ви неправильно зрозуміли тест Фрі. Це повинен бути RPPR у другому ряду, а не RPRR.
Шерлок9

@ Sherlock9 На жаль! Дійсно, я дякую.
EnragedTanker

Відповіді:


2

C 529 байт

#define M m[y][x]
char**m,*l,i;main(Y,X){for(;scanf("%ms",&l)>0;)(m=realloc(m,Y*8))[Y-1]=l,X=puts(m[Y++-1])-2;puts("");int s(x,y,c,d){(x<0|y<0|y/Y)?:({if(M^'R'&&M^'Y')if(M^'B'||c^2&&!((y&&m[y-1][x]=='Y')|(x&&m[y][x-1]=='Y')|(y<Y-1&&m[y+1][x]=='Y')|(x<X-1&&m[y][x+1]=='Y'))){x^X?:({M='#';return 1;});c=M^'O'?c:2;M^'U'?:({return s(x+(d<4?d-2:0),y+(d>3?d-5:0),1,d)?({M='#';1;}):0;});if(d^1&&s(x+1,y,c,3)||d^4&&s(x,y+1,c,6)||d^6&&s(x,y-1,c,4)||d^3&&s(x-1,y,c,1)){M='#';return 1;}}});return 0;}s(0,--Y/2,0,3);for(;i<Y;)puts(m[i++]);}

Ми підходимо до головоломки, крокуючи спочатку праворуч, за умови, що ми не заблоковані, потім намагаємося вгору, потім вниз і нарешті назад вліво. Пошук є рекурсивним, і як тільки ми визначимо успішний шлях, ми відзначаємо пробіли в нашій матриці та повертаємося.

Спробуйте в Інтернеті

Безумовно

#include <stdio.h>
#include <malloc.h>
char**m,*l,i;
main(Y,X) {
  for(Y=1;scanf("%ms",&l)>0;Y++)
      m=realloc(m,Y*8),
      m[Y-1]=l,
      X=puts(m[Y-1])-2;
  puts("");
  int step(x,y,c,d,i){
    if(x<0||y<0||y>=Y)return 0;
      if(m[y][x]=='R'||m[y][x]=='Y')return 0;
      if(m[y][x]=='B'&&(c==2||(y&&m[y-1][x]=='Y')||(x&&m[y][x-1]=='Y')
               ||(y<Y-1&&m[y+1][x]=='Y')||(x<X-1&&m[y][x+1]=='Y')))return 0;
      if(x==X){m[y][x]='#';return 1;}
      if(m[y][x]=='O')c=2;
      if(m[y][x]=='U')return step(x+(d<4?d-2:0),y+(d>3?d-5:0),1,d,i+1)?({m[y][x]='#';1;}):0;
      else if((d!=1&&step(x+1,y,c,3,i+1)) ||
    (d!=4&&step(x,y+1,c,6,i+1)) || (d!=6&&step(x,y-1,c,4,i+1)) ||
    (d!=3&&step(x-1,y,c,1,i+1))) {m[y][x]='#';return 1;}
      return 0;
  }
  step(0,--Y/2,0,3,0);
  for(;i<Y;)puts(m[i++]);
}

Приклад Вихід 1

PYYOPPPP
YRGGRYRG
PGPBYPUR
PYRBOYOG
OBPGYYPP
PRGPOYPO
YPYOUGPP
YGROBRYY
RGRYBBOG

PYY#####
YR##RYRG
###BYPUR
#YRBOYOG
#BPGYYPP
PRGPOYPO
YPYOUGPP
YGROBRYY
RGRYBBOG

Приклад Вихід 2

PBYRYPGP
OBRGOOBG
PGPGUROO
PUGORBUG
PUPUUURO
BGGUYPRG
GBOPGGRG
PUPUBUYB
GYOPRPOG

PBYRYPGP
OBRGOOBG
PGPGUROO
PUGORBUG
###UUURO
BG#UYPRG
GB####RG
PUPUB#YB
GYOPR###

Приклад Вихід 3

RRRR
RPPR
PUOR
RPBP

RRRR
R##R
###R
R###
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.