ความท้าทายนี้เกี่ยวกับการแปลงเขาวงกต 2 มิติเป็น 1D เขาวงกต
ภาพรวม
+-+-+-+-+-+-+ +-+-+-+-+-+-+ graph {
| | | | |A| | B| A B A -- D
+ + + + +-+-+ + + + + +-+-+ \ | C -- D
| | | | | | | | \ | D -- E
+-+-+ +-+-+ + +-+-+ +-+-+ + \ | E -- F
| | |C D E F| C---D-E---F E -- G
+-+-+-+ +-+ + +-+-+-+ +-+ + | | B -- F
| | | | G | | .---G | F -- J
+ +-+-+-+ + + + +-+-+-+ + + .' / | G -- H
| | | | |H|I |J| H I-' J G -- I
+-+-+-+-+-+-+ +-+-+-+-+-+-+ (ascii) } // (graphviz dot)
Figure 1 Figure 2 Figure 3
สำหรับจุดประสงค์ของการท้าทายนี้เขาวงกต 2D แบบดั้งเดิมคือเขาวงกตรูปสี่เหลี่ยมผืนผ้าที่สร้างขึ้นจากจุดขัดแตะที่มีสิ่งต่อไปนี้ทั้งหมด:
- มันถูกปิด (ขอบด้านนอกเชื่อมต่อกับผนัง)
- จุดขัดแตะทั้งหมดเชื่อมต่อกับผนัง
- มีการเชื่อมต่อ (สำหรับทุกสองช่องว่าง X และ Y มีเส้นทางระหว่างพวกเขา)
- มันเป็นวงจร (ไม่มีเส้นทางจากช่องว่างใด ๆ X กลับไปที่ X โดยไม่ย้อนรอย)
รูปที่ 1 แสดงเขาวงกต 2D แบบดั้งเดิม เขาวงกตเหล่านี้มีสามด้านที่น่าสนใจ:
- จุดจบตาย - สถานที่ที่มีเพียงเส้นทางเดียวเท่านั้น
- ทางเดิน - สถานที่ที่มีสองเส้นทางที่พร้อมใช้งาน
- จุดตัดสินใจ - สถานที่ที่มีเส้นทางที่มีอยู่สามหรือสี่เส้นทาง
สำหรับเขาวงกตทุกคนสามารถสร้างกราฟที่จุดสิ้นสุดและจุดตัดสินใจเป็นโหนดและมีขอบระหว่างทุกสองโหนดที่เชื่อมต่อกันด้วยเส้นทางตามทางเดิน รูปที่ 2 แสดงเขาวงกตเดียวกันกับโหนดดังกล่าวที่มีป้ายกำกับและรูปที่ 3 กราฟของเขาวงกต (ในรูปแบบ ASCII และ Graphviz dot dot)
เขาวงกต 1D
เขาวงกต 1D รวมคะแนนวาร์ปซึ่งมีคู่และถูกระบุด้วยตัวอักษร (ในทั้งสองกรณี) รูปที่ 4 แสดงตัวอย่างเขาวงกต 1D นี่เป็นเช่นเดียวกับเขาวงกต 2 มิติที่มีความสูง 1 ดังแสดงในรูปที่ 5 หมายเหตุโดยเฉพาะอย่างยิ่งในรูปที่ 5 ตำแหน่งของจุดขัดแตะที่ทำเครื่องหมายโดย+
สลับจากซ้ายไปขวา ในเขาวงกต 1D ตัวละครทุกตัวที่ขึ้นต้นด้วยกำแพงด้านซ้ายก็เป็นจุดขัดแตะ
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| D| D E|G E F| F | G | | D| D E|G E F| F | G |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Figure 4 Figure 5
กฎสำหรับการนำทางเขาวงกตนี้มีดังนี้ การเคลื่อนไหวทุกครั้งสามารถแสดงเป็นไปข้างหน้า ( >
) หรือข้างหลัง ( <
) ไปข้างหน้าและข้างหลังโดยค่าเริ่มต้นมีความหมายเช่นเดียวกับการรับรู้เชิงพื้นที่ของเรา ไปข้างหน้าไปยังตำแหน่งทันทีทางขวาและย้อนกลับไปทางซ้ายทันที
จุดแปรปรวนเป็นตัวแทนของสถานที่ที่ไม่สมมาตรสลับการเชื่อมต่อกับเพื่อนบ้าน หากคุณมาจากเพื่อนบ้านถึงจุดแปรปรวนตำแหน่งของจุดแปรปรวนสองจุดจะถูกสลับเปลี่ยน หากคุณมาจากจุดแปรปรวนกับเพื่อนบ้านพวกเขาจะไม่เปลี่ยน ตัวอย่างเช่นในรูปที่ 6 การเลื่อนถอยหลังจาก 1 นำคุณมาที่ 2 (เนื่องจาก 1 คือเพื่อนบ้านของ G และเรากำลังย้ายจากเพื่อนบ้านจุดที่ 2 และ @ ถูกเปลี่ยนเป็น) ก้าวไปข้างหน้าจาก 2 (วาร์ปจุด G) นำคุณมาที่ 3 (ที่นี่เราเริ่มจากจุดแปรปรวนดังนั้นจึงไม่มีการสลับ) การย้อนกลับจาก 3 จะนำคุณไปที่ @
54 2367 89^ @1
| D| D E|G E F| F | G |
Y X
Figure 6
รูปที่ 6 นอกจากนี้ยังแสดงให้เห็นถึงการนำทางเช่นจาก X เป็น Y <<>><>>>>>
โดยใช้ลำดับของการเคลื่อนไหว การเคลื่อนไหวเหล่านี้จะนำคุณไปสู่จุดที่มีป้ายกำกับ123456789^
ตามลำดับตามลำดับ อย่าลังเลที่จะสำรวจด้วยตัวคุณเองโดยใช้ข้อมูลโค้ดในส่วนถัดไป
แปลง 2D เป็น 1D
เมื่อให้เขาวงกต 1D เราสามารถสร้างกราฟโดยที่แต่ละโหนดนั้นเป็นเดดเอนด์หรือคู่ชี้วาร์ปและมีขอบระหว่างโหนดสองโหนดที่เชื่อมต่อกันตามทางเดิน กราฟนี้ช่วยให้เราสามารถเปรียบเทียบเขาวงกต 1D และ 2D
ตัวอย่างเช่นเขาวงกต 1D ในรูปที่ 4 เป็นเขาวงกตเดียวกันในรูปที่ 1 เพื่อดูว่าทำไมรูปที่ 7 เพิ่มป้ายชื่อให้กับปลายตาย การใช้ป้ายกำกับเหล่านี้เพื่อสร้างกราฟกราฟของรูปที่ 7 เป็นเพียงรูปที่ 3 อีกครั้ง รูปที่ 8 แสดงการแยกส่วนของการสร้างกราฟนี้
| D| D E|G E F| F | G |
A C B J H I
Figure 7
| D| D E|G E F| F | G |
+ + + + + + + + + + + + + + + <- lattice points
|A |C | |B J|H I| <- dead ends
|A D|C D E|G E F|B F J|H G I| <- all nodes (dead ends+warp points); i.e.:
"where each end is either a dead end
or a warp point pair"; note that each
pair of warp points is the same node.
|A-D|C-D-E|G-E-F|B-F-J|H-G-I| <- corridors; note each is a connection, since
1 2 3 4 5 6 7 8 9 "edges exist between any two nodes
connected along a corridor"
graph { graph {
A -- D // 1 <----> A -- D
C -- D // 2 <----> C -- D
D -- E // 3 <----> D -- E
G -- E // 4 <----> E -- G
E -- F // 5 <----> E -- F
B -- F // 6 <----> B -- F
F -- J // 7 <----> F -- J
H -- G // 8 <----> G -- H
G -- I // 9 <----> G -- I
} ^ }
Built from | From Figure 3
1D maze `-> isomorphic mappings
Figure 8
(โปรดทราบว่าป้ายกำกับและเลย์เอาต์ของกราฟแต่ละกราฟได้รับการเลือกเพื่อจัดแนวเพื่อใช้เป็นภาพประกอบโดยทั่วไปการพูดนี้เป็นปัญหามอร์ฟิซึ่มส์ของกราฟ )
ตัวอย่างต่อไปนี้มีไว้เพื่อช่วยให้เห็นภาพกลไกของเขาวงกต 1D และการเชื่อมต่อระหว่างเขาวงกต 1D กราฟสมมูลและเขาวงกต 2D
ในขณะที่คุณนำทางเขาวงกต 1D ในตัวอย่างนี้สองโหนดสุดท้ายที่คุณสัมผัสจะถูกเน้น โหนเดียวกันจะถูกเน้นด้วยวิธีเดียวกันบนกราฟที่เท่ากันและเขาวงกต 2 มิติ
โดยทั่วไปแล้วสำหรับเขาวงกต 2D แบบดั้งเดิมคุณสามารถสร้างเขาวงกต 1D เทียบเท่าประเภทนี้ได้ ตัวอย่างที่ซับซ้อนขึ้นเล็กน้อยคือรูปที่ 9:
+-+-+-+-+-+-+ +-+-+-+-+-+-+ graph {
| | | | | |A| | |B| A B A -- D
+ + + + + + + + + + + + + + \ / C -- D
| | | | | | | | | | \ / D -- E
+-+-+ + +-+-+ +-+-+ + +-+-+ \ / B -- E
| | |C D E | C---D-E E -- F
+-+-+-+ +-+ + +-+-+-+ +-+ + |\ E -- I
| | | | F | | .---F \ F -- G
+ +-+-+-+ + + + +-+-+-+ + + .' / \ G -- H
| | | | |G|H |I| G H-' I H -- I
+-+-+-+-+-+-+ +-+-+-+-+-+-+ (ascii) } // (graphviz dot)
Figure 9 Figure 10 Figure 11
| D| D E |F E | F | | D| D E |F E | F |
A C I B G H
Figure 12 Figure 13
เขาวงกตนี้มีโหนดที่มีสี่เส้นทาง (E ในรูปที่ 10) รูปที่ 11 แสดงกราฟ รูปที่ 12 เป็นเขาวงกต 1D ที่เทียบเท่ากัน และรูปที่ 13 แสดงเขาวงกตเดียวกันกับป้ายชื่อสำหรับปลายตายเพื่อเปรียบเทียบกับรูปที่ 11
ท้าทาย
รับ 2D Maze เป็นอินพุตให้เขียนฟังก์ชันหรือโปรแกรมที่แปลงเขาวงกต 2D เป็นเขาวงกต 1D ที่มีจุดวาร์ป คะแนนแปรปรวนอาจใช้ตัวอักษร 52 ตัวในแต่ละกรณี
รับประกันการป้อนข้อมูล (หากสิ่งเหล่านี้ไม่ตรงกับข้อมูลที่คุณไม่ต้องทำ):
- เขาวงกตอินพุตนั้นเชื่อมต่ออยู่ (นั่นคือคุณสามารถไปจากที่ใดก็ได้ไปยังที่อื่น ๆ )
- เขาวงกตอินพุตถูกปิด
- เขาวงกตอินพุตเป็นรูปสี่เหลี่ยมผืนผ้า
+
ทั้งหมดใช้จุดขัดแตะ- ผนังทั้งหมดระหว่างจุดขัดแตะในแถวเดียวกันใช้
|
-
ผนังทั้งหมดระหว่างจุดตาข่ายในการใช้งานคอลัมน์เดียวกัน- ช่องว่างทั้งหมดเป็นส่วนหนึ่งของเส้นทาง (และภายในเขาวงกต)
- เส้นทางเป็นช่องว่างทั้งหมด (ซึ่งมักจะเป็นแบบดั้งเดิมไม่แปรปรวน)
- พา ธ นั้นกว้างหนึ่งช่องว่าง
- เขาวงกตที่สร้างขึ้นโดยการเชื่อมต่อจุดบนขัดแตะ
- มีโหนดรวมไม่เกิน 52 โหนด (เช่นจุดสิ้นสุดและจุดตัดสินใจ) ในกราฟของเขาวงกต
รูปแบบผลลัพธ์:
- ผลลัพธ์ของคุณควรเป็นบรรทัดเดียวที่แสดงว่าเป็นเขาวงกต 1D
- ผลลัพธ์ของคุณไม่ควรมีช่องว่างนำหน้า / ต่อท้าย ยกเว้นว่าบรรทัดใหม่ต่อท้ายนั้นใช้ได้
- ตัวละครตัวแรกและตัวละครอื่น ๆ หลังจากนั้นเป็นจุดขัดแตะ
- ผนังทั้งหมดควรอยู่ในจุดขัดแตะ และจุดแปรปรวนทั้งหมดระหว่างพวกเขา
- กราฟของเขาวงกต 1D ของคุณควรเทียบเท่ากับกราฟของเขาวงกต 2D
- เขาวงกต 1D ของคุณต้องกะทัดรัด จุดที่ไม่ขัดสีทั้งหมดต้องเป็นจุดสิ้นสุด (เช่นติดกับกำแพง) หรือจุดแปรปรวน
- ตัวอักษรในการส่งออกของคุณควรจะจุดวิปริต แต่ละจุดวาร์ปเกิดขึ้นบนเส้นสองครั้งอย่างแน่นอน
ตัวอย่าง:
| D| D E|G E F| F | G | <- (1,2) The single line output
+ + + + + + + + + + + + + + + <- lattice point spacing... (3)
(4,6) lattice points are all walls or spaces
(5) See Figure 8
(7) D, E, F, G appear twice; no other labels
นี่คือรหัสกอล์ฟ ผู้ชนะคือการส่งที่ไม่ใช่ช่องโหว่ที่ถูกต้องและมีไบต์น้อยที่สุด
การทดสอบ
ไม่มีกรณีทดสอบสำหรับความท้าทายนี้เนื่องจากมีเอาต์พุตที่ถูกต้องจำนวนมากสำหรับเขาวงกตที่ไม่สนใจ
อย่างไรก็ตามฉันได้สร้างตัวตรวจสอบใน C ++ (ตัวตรวจสอบกราฟนี้ทั้งสองวิธีผ่านการแปลงแบบกราฟิก )
นอกจากนี้ต่อไปนี้เป็นตัวอย่างเล็ก ๆ น้อย ๆ ที่จะช่วยแสดงการจัดรูปแบบที่เหมาะสม:
ตัวอย่างที่ 1
+-+-+-+-+-+-+
| | | |
+ + + + +-+-+
| | | |
+-+-+ +-+-+ +
| |
+-+-+-+ +-+ +
| | |
+ +-+-+-+ + +
| | | |
+-+-+-+-+-+-+
->
| D| D E|G E F| F | G |
ตัวอย่างที่ 2
+-+-+-+-+-+-+
| | | | |
+ + + + + + +
| | | | |
+-+-+ + +-+-+
| |
+-+-+-+ +-+ +
| | |
+ +-+-+-+ + +
| | | |
+-+-+-+-+-+-+
->
| D| D E |F E | F |