帮助开发Alphys最新拼图!


16

地下皇家科学家Alphys已经完成了一个新拼图的原型。但是,她似乎找不到任何愿意测试的人。

她的困惑规则如下:

目标是从左侧最中心的图块开始,到达右侧。对于高度为偶数的拼图,请从两个中心磁贴中的较低者开始。(示例:在索引为零的4x4数组中,起始位置为[2,0]-第2行,第0列。在索引为零的5x5数组中,起始位置为[2,0]-第2行,第2列0.)

每个彩色图块都有自己的“ adsistic”功能:

  • 粉色和绿色磁贴(分别表示为“ P”和“ G”)没有任何作用
  • 红色和黄色的磁贴(“ R”,“ Y”)不可逾越。
  • 橙色方块(“ O”)使玩家闻起来像橙色
  • 紫色瓷砖(“ U”)会迫使玩家朝他们面对的方向移动到下一个瓷砖,并使它们闻起来像柠檬
  • 蓝色瓷砖(“B”),只要播放器是通行闻起来像橘子。

为了阐明风味机制,玩家的气味将无限期地持续,或者直到被不同气味的瓷砖所覆盖为止,即,如果玩家踩到橙色瓷砖上,他们会闻起来像橙色,直到他们踩到紫色瓷砖上为止。

另外,与蓝色瓷砖垂直或水平放置的黄色瓷砖也会导致蓝色瓷砖无法通行。


您的任务是编写一个程序或函数,该程序或函数接受表示拼图布局的二维字符数组(或一维字符串数组,或其他有效格式)作为输入,并输出原始拼图和已解决的拼图,并带有星号或某些其他字符显示正确的路径。假设给定的难题是可以解决的。

以这个难题为例:

BGYBG
PGPBG
PUBPB
OUGYB
PPOPP

您的程序将输出:

BGYBG
PGPBG
PUBPB
OUGYB
PPOPP

BGYBG
PGPBG
*****
OUGYB
PPOPP

必须使用this生成使用的任何拼图。

适用标准代码高尔夫规则。最佳答案将是每种语言的最短答案。答案必须包含语言,字节数和三个测试用例。前两个可以是您选择的任何布局,但第三个必须是:

RRRR
RPPR
PUOR
RPBP

建议的测试案例:RRRR | RPPR | PUOR | RPBP。如果我没有记错的话,这要求您两次遍历U磁贴。另外,我不确定U块无法通过时的行为,您是否仍可以行走到U块上,还是无法做到这一点?
FryAmTheEggman

@FryAmTheEggman如果U磁贴之后的磁贴无法通过,则您无法在该方向上在U磁贴上行走。
EnragedTanker

@TimmyD猜猜我第一次做这个难题的时候没有注意到。
EnragedTanker

@crayzeedude我认为您弄错了Fry的测试用例。第二行应该是RPPR,而不是RPRR。
Sherlock16年

@ Sherlock9糟糕!确实,我做到了,谢谢。
EnragedTanker

Answers:


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###
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.