Mathicala: True Labyrinth (827 ký tự)
Ban đầu, tôi đã tạo một đường dẫn từ {1,1,1} đến {5,5,5} nhưng vì không thể thực hiện lần lượt sai nào, tôi đã giới thiệu các nhánh hoặc "điểm quyết định" (đỉnh độ> 2) trong đó người ta sẽ cần phải quyết định con đường nào để đi. Kết quả là một mê cung hoặc mê cung thực sự.
"Những con hẻm mù" khó giải quyết hơn nhiều so với việc tìm một con đường trực tiếp đơn giản. Điều khó khăn nhất là loại bỏ các chu trình trong đường dẫn trong khi cho phép các chu trình thoát khỏi đường dẫn giải pháp.
Hai dòng mã sau đây chỉ được sử dụng để hiển thị các biểu đồ được vẽ, do đó mã không được tính, vì nó không được sử dụng trong giải pháp.
o = Sequence[VertexLabels -> "Name", ImagePadding -> 10, GraphHighlightStyle -> "Thick",
ImageSize -> 600];
o2 = Sequence[ImagePadding -> 10, GraphHighlightStyle -> "Thick", ImageSize -> 600];
Mã đã được sử dụng:
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]
Sản lượng mẫu
{{"oxooo", "xxooo", "xoxxo", "xoxxo", "xxoox"}, {"ooxoo", "xoooo", "ooxox", "oooxx", "xooxx"}, {"oooxx" "ooxxo", "ooxox", "xoxoo", "xxxoo"}, {"oxxxx", "oooox", "xooox", "xoxxx", "oooxx"}, {"xxxxx", "ooxox", "oooox "," xoxoo "," oooxo "}}
Dưới mui xe
Hình dưới đây cho thấy mê cung hoặc mê cung tương ứng với giải pháp ({{"ooxoo",...}}
được hiển thị ở trên:
Đây là mê cung tương tự được chèn trong 5x5x5 GridGraph
. Các đỉnh được đánh số là các nút trên con đường ngắn nhất ra khỏi mê cung. Lưu ý các nhánh hoặc điểm quyết định tại 34, 64 và 114. Tôi sẽ bao gồm mã được sử dụng để hiển thị biểu đồ mặc dù đó không phải là một phần của giải pháp:
HighlightGraph[gg = GridGraph[ConstantArray[5, 3]], g,
GraphHighlightStyle ->"DehighlightFade",
VertexLabels -> Rule @@@ Transpose[{s, s}] ]
Và biểu đồ này chỉ hiển thị giải pháp cho mê cung:
HighlightGraph[gg = GridGraph[ConstantArray[5, 3]],
Join[s, e[s]], GraphHighlightStyle -> "DehighlightFade", VertexLabels -> Rule @@@ Transpose[{s, s}] ]
Cuối cùng, một số định nghĩa có thể giúp đọc mã:
Giải pháp ban đầu (432 char, Tạo ra một con đường nhưng không phải là một mê cung hay mê cung thực sự)
Hãy tưởng tượng một khối rắn lớn 5x5x5 được tạo thành từ các khối đơn vị riêng biệt. Sau đây bắt đầu mà không có khối đơn vị tại {1,1,1} và {5,5,5}, vì chúng tôi biết chúng phải là một phần của giải pháp. Sau đó, nó loại bỏ các khối ngẫu nhiên cho đến khi có một đường dẫn không bị chặn từ {1,1,1} đến {5,5,5}.
"Mê cung" là con đường ngắn nhất (nếu có thể có nhiều hơn một) với các khối đơn vị đã bị loại bỏ.
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]
Thí dụ:
{{"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"}}
Về mặt kỹ thuật, đây chưa phải là một mê cung thực sự, vì không có ngã rẽ nào mà người ta có thể thực hiện. Nhưng tôi nghĩ nó thú vị khi bắt đầu vì nó dựa trên lý thuyết đồ thị.
Thói quen thực sự tạo ra một mê cung nhưng tôi đã cắm tất cả các vị trí trống có thể làm phát sinh chu kỳ. Nếu tôi tìm được cách xóa chu kỳ, tôi sẽ đưa mã đó vào đây.