迷路は解決できますか?


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です。水平方向と垂直方向にのみ移動できます。最短のコード勝ち


入力は文字列または配列にする必要がありますか?
apsillers

3
(n、m)に1(壁)がある場合、コードは0を返しますか?
trichoplax 14

3
((0,0)の壁と同じ?)
マーティンエンダー14

3
あなたはそれがm×mの迷路であると言いますが、あなたの索引付けはそれが(n + 1)×(m + 1)の迷路であることを意味します。
ニックマッテオ14

3
正規表現ソリューションを楽しみにしています=)
flawr 14

回答:


7

CJam、42 41 39 36 35バイト

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

この答えの考えに基づいて。

オプティマイザーのおかげで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.入力の最初の3文字は[[0
オプティマイザー14

7

Dyalog APL、27文字

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

評価された入力。APLは、行列とベクトルのベクトルを区別します。このプログラムは、入力が行列であることを前提としています。

(~×⍳∘⍴)Aはに相当するフォークです(~A) × ⍳⍴A2回言及したり、変数を導入したりしないようにする必要があります。

⍴Aはの形ですA。4行7列の行列の場合、形状は4 7です。

インデックスジェネレーターです。 ⍳4です1 2 3 4。 4行7列の行列に配置された⍳4 7ベクトル(1 1)(1 2)...(4 7)です。

~Aのビットを反転しますA

×⍳⍴A反転したビットを乗算することにより、すべての空きセルの座標を保持し、すべての壁をに変え0 0ます。

,座標ペアの行列を解きます。つまり、ベクトルに線形化します。この場合、ベクトルはペアで構成されます。

∘.-⍨AまたはA∘.-AAペアワイズの要素を減算します。ここでの要素Aはそれ自体ペアであることに注意してください。

| 絶対値

+/¨絶対値の各ペアを合計します。これにより、壁を除いて、迷路内のセルの各ペア間のグリッド距離が得られます。

1≥私たちは、1以下の距離で隣人に興味を持っているだけです。これは壁も除外します。これで、グラフの隣接行列ができました。

∨.∧⍨⍣≡ フロイド-ウォーシャルの推移閉包アルゴリズム

(f⍣n)A(ここでnは使用しません)where is in integer is is power operatorです。時間に適用さfA nますf f ... f A

(f⍣g)Awhere gは関数で、固定小数点演算子、別名「電力制限」です。それは、一連の計算に保ちAf Af f A、...まで((f⍣i)A) g ((f⍣(i+1))A)いくつかのために真を返しますi。この場合、match()を使用しgます。

∨.∧⍨AまたはA∨.∧A、フロイドのアルゴリズムのステップです。 f.gは行列乗算の一般化(+.×)です。ここではandの代わりに接続詞()と選言()を使用します。+×

⊃⌽⍣≡ステップを十分に適用して安定状態に達した 後、マトリックスの右上隅を検索して結果を取得する必要があるため、それを反転()し、最初の左上の項目()を取得します。

⍣≡のステップの可視化


5

Python、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

Perl、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)。これは、2つの正規表現のおかげで行われs/(^0|A)(.{@{+}})?0/A$2A/sます。スペースがaの右または下にあるかどうかAs/0(.{@{+}})?A/A$1A/sチェックし、スペースがaの左または上にあるかどうかをチェックしますA。終わりに、最後のセルが含まれている場合A、それは到達可能だそうでない場合には、(その者が何ではありませんsay/A$/+0チェックし、+0確認結果はとなります作るためにここにいる01の代わりに、空の文字列1)。行全体に一致する
こと/.*/に注意してください。したがって、@+最初の行の末尾のインデックスに追加されます。これは、行のサイズになります。これにより、使用して、行にある.{@{+}}文字と正確に一致する文字を一致させることができます。(@{+}と同等ですが@+、正規表現で使用できるのは前者のみです)


以下の場合、このテストケース、あなたのコードは、最終的な位置であっても迷路解けるを検討します1
Jitse

@Jitse良いキャッチ。実際、TIOリンクが適切なコードを使用していなかったためです(以前のバージョンであり、見つけられなかったと思います)。答えはまだ有効であり、TIOリンクを更新しました。あなたの例はうまく動作します:オンラインで試してみてください!
ダダ

ああ、そうだ!説明をありがとう、私はこのアプローチが好きです。
Jitse

@Jitseありがとう、それは私のお気に入りのゴルフの1つです:)
ダダ

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からのsの塗りつぶしを(0, 0)行い、「終了」正方形がであるかどうかを確認します1


これにより、迷路が既に(n、m)に1を含んでいる場合、解決可能として扱われますか?
センモウヒラムシ

2

Java、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
プロヒント:、1つの文字クラスの何かに名前の間にスペースを捨てるString[]aし、許可されているというよりもSTDINコマンドライン引数からの入力を取ります。
パベル

1

Python 184 188

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文字

隣接行列の強化(非常に時間とメモリ効率が悪い)。(英語ではpoweringと呼ばれますか?)

   ({.@{:@(+./ .*.^:_~)@(+:/~@,*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.