เขาวงกตสามารถแก้ไขได้?


20

ปริศนา

  • พิมพ์ 0 หากเขาวงกต n * m ไม่สามารถแก้ไขได้
  • พิมพ์ 1 หากเขาวงกต n * m สามารถแก้ไขได้ (ใน 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
หากมี 1 (ผนัง) ที่ (n, m) รหัสควรส่งคืน 0 หรือไม่
trichoplax

3
(เหมือนกับกำแพงที่ (0,0)?)
Martin Ender

3
คุณบอกว่ามันเป็นเขาวงกต× m แต่การจัดทำดัชนีของคุณหมายความว่ามันเป็นเขาวงกต (n + 1) × (m + 1)
Nick Matteo

3
ฉันรอคอยการแก้ปัญหา regex =)
ข้อบกพร่อง

คำตอบ:


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. แม้ว่าจะสมมติว่าอักขระสามตัวแรกของอินพุตจะเป็น[[0
เครื่องมือเพิ่มประสิทธิภาพ

7

Dyalog APL, 27 ตัวอักษร

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

การประเมินการป้อนข้อมูล APL แยกความแตกต่างระหว่างเมทริกซ์และเวกเตอร์ของเวกเตอร์ โปรแกรมนี้อนุมานว่าอินพุตเป็นเมทริกซ์

(~×⍳∘⍴)A(~A) × ⍳⍴Aเป็นเทียบเท่าส้อม จำเป็นต้องหลีกเลี่ยงการพูดถึงสองครั้งหรือแนะนำตัวแปร

⍴AAเป็นรูปทรงของ สำหรับเมทริกซ์ 4 โดย 7 4 7รูปร่าง

เป็นตัวสร้างดัชนี เป็น ⍳4 คือเวกเตอร์ที่จัดเรียงในเมทริกซ์ 4 คูณ 71 2 3 4⍳4 7(1 1)(1 2)...(4 7)

~AAพลิกบิตของ

×โดยการคูณโดยบิตพลิกเรารักษาพิกัดของเซลล์ฟรีและเปิดผนังทั้งหมดลง⍳⍴A0 0

,ravels เมทริกซ์ของคู่พิกัดเช่นทำให้เป็นเชิงเส้นเป็นเวกเตอร์ ในกรณีนี้เวกเตอร์จะประกอบด้วยคู่

∘.-⍨AหรือA∘.-Aลบองค์ประกอบของApairwise โปรดทราบว่าที่นี่องค์ประกอบของAเป็นคู่ของตัวเอง

| ค่าสัมบูรณ์

+/¨หาผลรวมของค่าสัมบูรณ์แต่ละคู่ สิ่งนี้ทำให้เรามีระยะทางกริดระหว่างเซลล์ทุกคู่ในเขาวงกตประหยัดกำแพง

1≥เราเป็นเพียง intrested ในประเทศเพื่อนบ้านในระยะไม่เกิน 1 นี้ยังไม่รวมผนัง ตอนนี้เรามีเมทริกซ์ adjacency ของกราฟ

∨.∧⍨⍣≡ Floyd - อัลกอริธึมการปิดของ Warshall

(f⍣n)A(ไม่ได้ใช้ที่นี่) โดยที่nจำนวนเต็มคือตัวดำเนินการพลังงาน ใช้fกับA nเวลา: f f ... f A.

(f⍣g)Aโดยที่gฟังก์ชั่นเป็นตัวดำเนินการจุดคงที่หรือที่รู้จักกันว่า "ขีด จำกัด พลังงาน" มันช่วยในการคำนวณชุดA, f A, f f A, ... จนกระทั่งผลตอบแทนที่แท้จริงสำหรับบางคน((f⍣i)A) g ((f⍣(i+1))A) iในกรณีนี้เราจะใช้การจับคู่ ( ) gในฐานะ

∨.∧⍨AหรือA∨.∧Aเป็นขั้นตอนในอัลกอริทึมของฟลอยด์ f.gเป็นลักษณะทั่วไปของการคูณเมทริกซ์ ( +.×) ที่นี่เราใช้ร่วม ( ) และความร้าวฉาน ( ) ในสถานที่และ+×

⊃⌽ หลังจากที่⍣≡ใช้ขั้นตอนเพียงพอและถึงสถานะที่มั่นคงแล้วเราต้องค้นหามุมบนขวาของเมทริกซ์เพื่อรับผลลัพธ์ดังนั้นเราจึงพลิกมัน ( ) และนำรายการแรกซ้ายบน ( )

การแสดง⍣≡ขั้นตอนของ


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 อย่างไรฉันจึงนับมันเป็น 4 แทนที่จะเป็น 2 แต่มันไม่สำคัญมาก)

/.*/;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) นั่นคือขอบคุณทำสอง regex: s/(^0|A)(.{@{+}})?0/A$2A/sการตรวจสอบหากมีพื้นที่ด้านขวาหรือด้านล่างของที่Aในขณะที่การตรวจสอบหากมีพื้นที่อยู่ทางด้านซ้ายหรือด้านบนของs/0(.{@{+}})?A/A$1A/s Aในตอนท้ายหากเซลล์สุดท้ายมีเซลล์ที่Aเข้าถึงได้มิฉะนั้นจะไม่ (นั่นคือสิ่งที่say/A$/+0ตรวจสอบ+0อยู่ที่นี่เพื่อให้แน่ใจว่าผลลัพธ์จะเป็น0หรือ1แทนที่จะเป็นสตริงว่างเปล่าและ1)
โปรดทราบว่า/.*/จะตรงกับทั้งบรรทัดดังนั้นการตั้งค่า@+ไปยังดัชนีของจุดสิ้นสุดของบรรทัดแรกซึ่งเกิดขึ้นเป็นขนาดของบรรทัดซึ่งอนุญาตให้ใช้.{@{+}}เพื่อจับคู่อักขระให้ได้มากที่สุดเท่าที่มีในบรรทัด ( @{+}เทียบเท่า@+แต่สามารถใช้ในอดีตเท่านั้นใน regex)


สำหรับกรณีการทดสอบนี้ , 1รหัสของคุณพิจารณาเขาวงกตแก้ไขแม้ว่าตำแหน่งสุดท้ายคือ
Jitse

@Jitse จับได้ดี ที่จริงแล้วมันเป็นเพราะลิงค์ TIO ไม่ได้ใช้รหัสที่ถูกต้อง (ฉันเดาว่ามันเป็นรุ่นก่อนหน้านี้บางส่วนและฉันไม่ได้เห็นมัน) คำตอบนั้นยังคงใช้ได้และฉันได้อัปเดตลิงก์ TIO แล้ว ตัวอย่างของคุณใช้งานได้ดี: ลองออนไลน์!
Dada

โอ้ใช่! ขอบคุณสำหรับความกระจ่างฉันชอบวิธีนี้
Jitse

@Jitse ขอบคุณนั่นเป็นหนึ่งในสนามกอล์ฟที่ฉันชื่นชอบ :)
Dada

3

Ruby, 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หรือ0บน STDOUT

นานน่ารำคาญ มันก็ไม่ได้น้ำท่วมเติม1s จาก(0, 0)และจากนั้นตรวจสอบเพื่อดูว่า "จบ" 1ตารางเป็น


สิ่งนี้จะรักษาเขาวงกตได้ไหมถ้ามันมี 1 ที่ (n, m) อยู่แล้ว?
trichoplax

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
เคล็ดลับสำหรับมืออาชีพ: ตั้งชื่อชั้นเรียนของคุณบางสิ่งบางอย่างที่มีความยาวหนึ่งตัวเว้นช่องว่างระหว่างString[]และaและรับอินพุตจากอาร์กิวเมนต์บรรทัดคำสั่งแทน StdIn ซึ่งได้รับอนุญาต
Pavel

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 ตัวอักษร

กำลังของเมทริกซ์ adjacency (เวลามากและไม่มีประสิทธิภาพหน่วยความจำ) (มันเรียกว่าเปิดในภาษาอังกฤษ?)

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