Mathematica: True Labyrinth (827 ตัวอักษร)
เดิมทีฉันสร้างเส้นทางจาก {1,1,1} ถึง {5,5,5} แต่เนื่องจากไม่มีการทำผิดที่เป็นไปได้ฉันจึงแนะนำส้อมหรือ "จุดตัดสินใจ" (vertices of degree> 2) โดยที่ ใครจะต้องตัดสินใจว่าจะไปทางไหน ผลที่ได้คือเขาวงกตหรือเขาวงกตที่แท้จริง
"ตรอกซอกซอยคนตาบอด" นั้นท้าทายยิ่งกว่าการแก้ปัญหามากกว่าการค้นหาเส้นทางที่เรียบง่ายและตรงไปตรงมา สิ่งที่ท้าทายที่สุดคือการกำจัดรอบในเส้นทางในขณะที่อนุญาตให้รอบปิดเส้นทางการแก้ปัญหา
โค้ดสองบรรทัดต่อไปนี้ใช้สำหรับแสดงกราฟที่วาดขึ้นเท่านั้นดังนั้นโค้ดจะไม่ถูกนับเนื่องจากไม่ได้ใช้ในโซลูชัน
o = Sequence[VertexLabels -> "Name", ImagePadding -> 10, GraphHighlightStyle -> "Thick",
ImageSize -> 600];
o2 = Sequence[ImagePadding -> 10, GraphHighlightStyle -> "Thick", ImageSize -> 600];
รหัสที่ใช้:
e[c_] := Cases[EdgeList[GridGraph[ConstantArray[5, 3]]], j_ \[UndirectedEdge] k_ /; (MemberQ[c, j] && MemberQ[c, k])]
m[] :=
Module[{d = 5, v = {1, 125}},
While[\[Not] MatchQ[FindShortestPath[Graph[e[v]], 1, 125], {1, __, 125}],
v = Join[v, RandomSample[Complement[Range[125], v], 1]]];
Graph[e[Select[ConnectedComponents[Graph[e[v]]], MemberQ[#, 1] &][[1]]]]]
w[gr_, p_] := EdgeDelete[gr, EdgeList[PathGraph[p]]]
y[p_, u_] := Select[Intersection[#, p] & /@ ConnectedComponents[u], Length[#] > 1 &]
g = HighlightGraph[lab = m[], PathGraph[s = FindShortestPath[lab, 1, 125]],o]
u = w[g, s]
q = y[s, u]
While[y[s, u] != {}, u = EdgeDelete[u, Take[FindShortestPath[u, q[[1, r = RandomInteger[Length@q[[1]] - 2] + 1]],
q[[1, r + 1]]], 2] /. {{a_, b_} :> a \[UndirectedEdge] b}];
q = y[s, u]]
g = EdgeAdd[u, EdgeList@PathGraph[s]];
Partition[StringJoin /@ Partition[ReplacePart[Table["x", {125}],
Transpose[{VertexList[g], Table["o", {Length[VertexList@g]}]}]/. {{a_, b_} :> a -> b}], {5}], 5]
ตัวอย่างผลลัพธ์
{{"oxooo", "xxooo", "xoxxo", "xoxxo", "xxoox"}, {"ooxoo", "xoooo", "oooxx", "oooxx", "xooxx", "ooxxo", "ooxox", "xoxoo", "xxxoo"}, {"oxxxx", "oooox", "xooox", "xoxox", "oooxx"}, {"xxxxx", "ooxox", "oooox" "," xoxoo "," oooxo "}}
ภายใต้ประทุน
ภาพด้านล่างแสดงเขาวงกตหรือเขาวงกตที่สอดคล้องกับวิธีแก้ปัญหาที่({{"ooxoo",...}}
แสดงด้านบน:
นี่คือเขาวงกตเดียวกันแทรกอยู่ใน GridGraph
5x5x5 จุดยอดที่มีหมายเลขคือโหนดบนเส้นทางที่สั้นที่สุดออกจากเขาวงกต สังเกตส้อมหรือจุดตัดสินใจที่ 34, 64 และ 114 ฉันจะรวมรหัสที่ใช้ในการเรนเดอร์กราฟแม้ว่ามันจะไม่ได้เป็นส่วนหนึ่งของโซลูชัน:
HighlightGraph[gg = GridGraph[ConstantArray[5, 3]], g,
GraphHighlightStyle ->"DehighlightFade",
VertexLabels -> Rule @@@ Transpose[{s, s}] ]
และกราฟนี้แสดงวิธีแก้ปัญหาให้กับเขาวงกตเท่านั้น:
HighlightGraph[gg = GridGraph[ConstantArray[5, 3]],
Join[s, e[s]], GraphHighlightStyle -> "DehighlightFade", VertexLabels -> Rule @@@ Transpose[{s, s}] ]
ในที่สุดคำจำกัดความบางอย่างที่อาจช่วยในการอ่านรหัส:
โซลูชันดั้งเดิม (432 ถ่านสร้างเส้นทาง แต่ไม่ใช่เขาวงกตจริงหรือเขาวงกต)
ลองนึกภาพก้อนของแข็งขนาดใหญ่ 5x5x5 ซึ่งประกอบด้วยลูกบาศก์หน่วยที่แตกต่างกัน ต่อไปนี้เริ่มต้นโดยไม่มีลูกบาศก์หน่วยที่ {1,1,1} และ {5,5,5} เนื่องจากเรารู้ว่ามันต้องเป็นส่วนหนึ่งของการแก้ปัญหา จากนั้นจะลบคิวบ์แบบสุ่มจนกว่าจะมีเส้นทางที่ไม่มีข้อ จำกัด จาก {1,1,1} ถึง {5,5,5}
"เขาวงกต" เป็นเส้นทางที่สั้นที่สุด (ถ้ามีมากกว่าหนึ่งที่เป็นไปได้) ที่กำหนดให้หน่วยลูกบาศก์ที่ถูกลบออก
d=5
v={1,d^3}
edges[g_,c_]:=Cases[g,j_\[UndirectedEdge] k_/;(MemberQ[c,j]&&MemberQ[c,k])]
g:=Graph[v,edges[EdgeList[GridGraph[ConstantArray[d,d]]],v]];
While[\[Not]FindShortestPath[g,1,d^3]!={},
v=Join[v,RandomSample[Complement[Range[d^3],v],1]]]
Partition[Partition[ReplacePart[
Table["x",{d^3}],Transpose[{FindShortestPath[g,1,d^3],Table["o",{Length[s]}]}]
/.{{a_,b_}:> a->b}],{d}]/.{a_,b_,c_,d_,e_}:> StringJoin[a,b,c,d,e],5]
ตัวอย่าง:
{{"ooxxx", "xxxxx", "xxxxx", "xxxxx", "xxxxx"},
{"xoxxx", "xoooo", "xxxxo", "xxxxo", "xxxxo"},
{"xxxxx", "xxxxx", "xxxxx", "xxxxx", "xxxxo"},
{"xxxxx", "xxxxx", "xxxxx", "xxxxx", "xxxxo"},
{"xxxxx", "xxxxx", "xxxxx", "xxxxx", "xxxxo"}}
ในทางเทคนิคแล้วนี่ยังไม่ใช่เขาวงกตที่แท้จริงเนื่องจากไม่มีสิ่งผิดที่จะเกิดขึ้นได้ แต่ฉันคิดว่ามันน่าสนใจตั้งแต่เริ่มต้นเพราะมันอาศัยทฤษฎีกราฟ
กิจวัตรประจำวันทำให้เขาวงกตจริงๆ แต่ฉันเสียบที่ว่างทั้งหมดที่อาจก่อให้เกิดวัฏจักร หากฉันพบวิธีที่จะลบรอบฉันจะรวมรหัสนั้นที่นี่