미로를 해결할 수 있습니까?


20

퍼즐

  • 미로 n * m을 해결할 수없는 경우 0을 인쇄
  • 미로 n * m을 해결할 수있는 경우 1을 인쇄하십시오 (1 가지 이상의 방법으로).

(그래서 나는 경로를 요구하지 않지만 해결할 수 있다면!)

입력 배열 (2d) :

[[0,0,0,0,0,0,1],[0,0,0,0,0,1,0],[0,0,0,0,1,0,0],[1,0,0,0,0,0,0]]

XXXXXXXXX
XS     XX
X     X X
X    X  X
XX     FX
XXXXXXXXX

0 = can pass through
1 = can not pass trough
[0][n] is the last block of the first line
[m][0] is the first block of the last line

규칙 시작 위치는 0,0이고 끝 위치는 n, m입니다. 가로 및 세로로만 이동할 수 있습니다.


입력 값이 문자열 또는 배열이어야합니까?
apillers

3
(n, m)에 1 (벽)이 있으면 코드가 0을 반환해야합니까?
trichoplax

3
((0,0)의 벽과 동일합니까?)
Martin Ender

3
당신은 그것이 × m 미로라고 말하지만, 당신의 색인은 그것이 (n + 1) × (m + 1) 미로임을 암시합니다.
Nick Matteo

3
나는 정규식 솔루션을 기대하고 있습니다 =)
flawr

답변:


7

CJam, 42 41 39 36 35 바이트

Wq3>~_s,{{[{_2$+0<{e<_}*}*]}%z}*sW=

이 답변 의 아이디어를 기반으로합니다 .

Optimizer 덕분에 4 바이트.

입력 형식 :

[[0 0 0 0 0 0 1] [0 0 0 0 0 1 0] [0 0 0 0 1 0 0] [1 0 0 0 0 0 0]]

@Optimizer 감사합니다. 그러나 나는 더 짧은 길을 찾았다.
jimmy23013

1
q2Wts~_s,{{[{_2$+0<{e<_}*}*]}%z}*sW=-36. 입력의 처음 세 문자는 다음과 [[0
Optimizer

7

Dyalog APL, 27 자

⊃⌽∨.∧⍨⍣≡1≥+/¨|∘.-⍨,(~×⍳∘⍴)⎕

입력 평가. APL은 행렬과 벡터로 구성된 벡터를 구분합니다. 이 프로그램은 입력이 행렬이라고 가정합니다.

(~×⍳∘⍴)A는 포크에 해당합니다 (~A) × ⍳⍴A. 두 번 언급 하거나 변수를 도입 하지 않아야 합니다.

⍴A의 모양입니다 A. 4x7 행렬의 경우 모양은 4 7입니다.

인덱스 생성기입니다. ⍳4입니다 1 2 3 4. ⍳4 7는 4x7 (1 1)(1 2)...(4 7)행렬로 배열 된 벡터 입니다.

~A의 비트를 뒤집습니다 A.

×⍳⍴A뒤집힌 비트 를 곱하면 모든 자유 셀의 좌표를 유지하고 모든 벽을로 바꿉니다 0 0.

,좌표 쌍의 행렬을 모방합니다. 즉, 벡터로 선형화합니다. 이 경우 벡터는 쌍으로 구성됩니다.

∘.-⍨A또는 pairwise A∘.-A요소를 뺍니다 A. 여기서 요소의 요소는 A쌍입니다.

| 절대 값

+/¨각 절대 값 쌍을 합산하십시오. 이것은 미로의 모든 세포 쌍 사이의 그리드 거리를 제공하여 벽을 절약합니다.

1≥우리는 1 이하의 거리에서 이웃에게만 모욕을받으며 벽도 제외합니다. 이제 그래프의 인접 행렬이 있습니다.

∨.∧⍨⍣≡ 플로이드-워샬의 전이 폐쇄 알고리즘

(f⍣n)A여기서,는 (여기에 사용되지 않은) n정수 파워 연산자이다. 그것은 적용 fA n시간 : f f ... f A.

(f⍣g)A여기서 g함수는 "전력 제한"이라고하는 고정 소수점 연산자입니다. 그것은 일련의 계산에 유지 A, f A, f f A, ...까지 ((f⍣i)A) g ((f⍣(i+1))A)일부 TRUE를 반환합니다 i. 이 경우 match ( )를로 사용 g합니다.

∨.∧⍨A또는 A∨.∧AFloyd 알고리즘의 한 단계입니다. f.g행렬 곱셈 (일반화이다 +.×), 여기에서 우리는 함께 (사용 )과 이접 ( 대신) +×.

⊃⌽⍣≡단계 충분한 시간을 적용하고 안정된 상태에 도달, 우리는 우리가 그것을 (플립, 그래서 결과를 얻을 수있는 행렬의 오른쪽 상단 모서리를 검색해야한다 ) 첫 번째, 왼쪽 위 항목을 ( ).

⍣≡의 단계 시각화


5

파이썬, 164 바이트

def s(a):
 d=[(0,0)]
 while d:i,j=d.pop();a[i][j]=2;d+=[(x,y)for x,y in[(i-1,j),(i,j-1),(i+1,j),(i,j+1)]if len(a[0])>y>-1<x<len(a)and a[x][y]<1]
 return a[-1][-1]>1

나는 실제로 골프장을 채우는 것이 실제로 홍수 채우기를 실제로하는 방법이기 때문에 이것을 게시하는 것을 꺼려했습니다. 그러나 어쨌든 여기 있습니다.


4

펄, 73 바이트

69 바이트의 코드 + 4 바이트 -n0E(2014 년에 태그가 어떻게 계산되었는지 확실하지 않으므로 2 대신 4로 계산했지만별로 중요하지 않습니다).

/.*/;s/(^0|A)(.{@{+}})?0/A$2A/s||s/0(.{@{+}})?A/A$1A/s?redo:say/A$/+0

온라인으로 사용해보십시오! (그리고 1111011줄을로 1111111바꾸면 더 이상 미로를 해결할 수 없으며 출력은 0대신됩니다 1: 온라인 사용해보십시오! )

설명 :

이 코드는 미로의 도달 가능한 모든 셀을 찾고 (으로 표시 A) 셀이로 표시된 셀에 닿으면 A도달 할 수 있으며 셀도 표시합니다 A. 그리고 우리는 그것을 다시합니다 ( redo). 즉 두 개의 정규식하기 위해 수행 덕분입니다 : s/(^0|A)(.{@{+}})?0/A$2A/s검사 공간이 우측 또는 하단에있는 경우 A, 동안 s/0(.{@{+}})?A/A$1A/s검사 공간이 왼쪽 또는 상단에있는 경우 A. 끝에서, 마지막 셀이 포함 된 경우 A(무엇의 것을 그렇지 않으면이 아니다, 그것의 도달을 say/A$/+0하며 수표 +0여기 확실히 결과가 될 것입니다 만들기 위해 0또는 1대신 빈 문자열1).
/.*/전체 라인을 일치합니다, 이렇게 설정@+첫 번째 줄 끝의 색인에 대한 행의 크기로 인해 줄에있는 .{@{+}}문자 수만큼 정확하게 일치 하는 데 사용할 수 있습니다 . ( @{+}와 동일 @+하지만 정규식에는 전자 만 사용할 수 있음)


를 들어 이 테스트 케이스 , 코드는 최종 위치가있는 경우에도 풀 수 미로 간주합니다 1.
Jitse

@Jitse 잘 잡아라. 실제로 TIO 링크가 올바른 코드를 사용하지 않았기 때문입니다 (이전 버전이었고 그것을 발견하지 못했습니다). 대답은 여전히 ​​유효하며 TIO 링크를 업데이트했습니다. 당신의 예제는 잘 작동합니다 : 온라인으로 사용해보십시오!
Dada

아 맞다! 설명 주셔서 감사합니다, 나는이 접근법을 좋아한다.
Jitse

@Jitse 덕분에, 그것은 내가 가장 좋아하는 골프 중 하나입니다 :)
Dada

3

루비 133 개 130 129 문자

a=eval gets
f=->x,y{a[x][y]=1
[[-1,0],[1,0],[0,-1],[0,1]].map{|o|d,e=x+o[0],y+o[1]
f[d,e]if a[d]&&a[d][e]==0}}
f[0,0]
p a[-1][-1]

STDIN, 출력 1또는 0STDOUT 에 입력하십시오 .

짜증나게 길다. 그것은 단순히의 홍수 채우기 수행 1에서의 (0, 0)은 "끝"사각형이 있는지 여부를 확인하기 위해, 다음 검사를 1.


미로에 이미 1 at (n, m)을 포함하고 있다면 미로를 풀 수있는 것으로 취급합니까?
trichoplax

2

자바, 418 바이트

import java.util.Scanner;public class Solvable{static int w,h;public static void main(String[] a){String[]i=new Scanner(System.in).nextLine().split(";");h=i.length+2;w=i[0].length()+2;int[]m=new int[w * h];for(int x=1;x<w-1;x++)for(int y=1;y<h-1;y++)m[y*w+x]=i[y-1].charAt(x-1)<'.'?0:1;f(m,w+1);System.out.println(m[w*h-w-2]>0?0:1);}static void f(int[]m,int i){if(m[i]>0){m[i]--;f(m,i-1);f(m,i+1);f(m,i-w);f(m,i+w);}}}

내 첫 번째 코드 골프. Java를 선택한 이유를 모르겠습니다. xD 골프에는 너무 나쁩니다.

예제 미로는 stdin을 통해 다음과 같이 입력됩니다.

......#;.....#.;....#..;#......

1
전문가 팁 : 클래스 이름을 한 문자 길이로 지정 String[]하고와 사이에 공백을 a남기고 허용되는 StdIn이 아닌 명령 줄 인수에서 입력을받습니다.
Pavel

1

파이썬 184188

def f(a,x=0,y=0,h=[]):s=h+[[x,y]];X,Y=len(a[0]),len(a);return([x,y]in h)==(x>=X)==(y>=Y)==(x<0)==(y<0)==a[y][x]<(x==X-1and y==Y-1or f(a,x-1,y,s)|f(a,x+1,y,s)|f(a,x,y-1,s)|f(a,x,y+1,s))

이것은 내가 생각했던 것보다 훨씬 길었습니다. (어쨌든, 더 이상 골프를 칠 수 없으면 설명을 추가 할 것입니다.


1

J, 75 자

인접 매트릭스의 전원 공급 (시간과 메모리 비효율적) (영어로 전원 공급이라고하나요?)

   ({.@{:@(+./ .*.^:_~)@(+:/~@,*2>(>@[+/@:|@:->@])"0/~@,@(i.@#<@,"0/i.@#@|:)))

일부 테스트 사례 :

   m1=. 0 0 0 0 0 0 1,. 0 0 0 0 0 1 0,.  0 0 0 0 1 0 0,. 1 0 0 0 0 0 0
   m2=. 0 1 1 ,. 0 0 0
   m3=. 0 1 0 ,. 1 1 0
   m4=. 0 1 1 0 ,. 0 0 1 0
   ({.@{:@(+./ .*.^:_~)@(+:/~@,*2>(>@[+/@:|@:->@])"0/~@,@(i.@#<@,"0/i.@#@|:))) every m1;m2;m3;m4
1 1 0 0


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.