Mathematica: True Labyrinth (827 chars)
Awalnya, saya membuat jalur dari {1,1,1} ke {5,5,5} tetapi karena tidak ada kesalahan yang mungkin dilakukan, saya memperkenalkan garpu atau "titik keputusan" (simpul derajat> 2) di mana orang perlu memutuskan jalan mana yang harus dilalui. Hasilnya adalah labirin atau labirin sejati.
"Jalan buntu" jauh lebih sulit untuk dipecahkan daripada menemukan jalan langsung yang sederhana. Hal yang paling menantang adalah untuk menghilangkan siklus dalam jalur sementara memungkinkan siklus dari jalur solusi.
Dua baris kode berikut hanya digunakan untuk merender grafik yang digambar, sehingga kode tidak dihitung, karena tidak digunakan dalam solusi.
o = Sequence[VertexLabels -> "Name", ImagePadding -> 10, GraphHighlightStyle -> "Thick",
ImageSize -> 600];
o2 = Sequence[ImagePadding -> 10, GraphHighlightStyle -> "Thick", ImageSize -> 600];
Kode yang digunakan:
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]
Output sampel
{{"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 "}}
Dibawah tenda
Gambar di bawah ini menunjukkan labirin atau labirin yang sesuai dengan solusi yang ({{"ooxoo",...}}
ditampilkan di atas:
Berikut adalah labirin yang sama yang dimasukkan dalam 5x5x5 GridGraph
. Vertex bernomor adalah node pada jalur terpendek keluar dari labirin. Catat garpu atau titik keputusan pada 34, 64, dan 114. Saya akan memasukkan kode yang digunakan untuk membuat grafik meskipun itu bukan bagian dari solusi:
HighlightGraph[gg = GridGraph[ConstantArray[5, 3]], g,
GraphHighlightStyle ->"DehighlightFade",
VertexLabels -> Rule @@@ Transpose[{s, s}] ]
Dan grafik ini hanya menunjukkan solusi untuk labirin:
HighlightGraph[gg = GridGraph[ConstantArray[5, 3]],
Join[s, e[s]], GraphHighlightStyle -> "DehighlightFade", VertexLabels -> Rule @@@ Transpose[{s, s}] ]
Akhirnya, beberapa definisi yang dapat membantu membaca kode:
Solusi asli (432 char, Menghasilkan jalur tetapi bukan labirin atau labirin sejati)
Bayangkan sebuah kubus padat 5x5x5 besar yang terbuat dari kubus satuan yang berbeda. Berikut ini dimulai tanpa satuan kubus pada {1,1,1} dan {5,5,5}, karena kami tahu mereka harus menjadi bagian dari solusi. Kemudian menghapus kubus acak sampai ada jalan tanpa hambatan dari {1,1,1} ke {5,5,5}.
"Labirin" adalah jalur terpendek (jika lebih dari satu dimungkinkan) mengingat satuan kubus yang telah dihapus.
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]
Contoh:
{{"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"}}
Secara teknis ini belum merupakan labirin sejati, karena tidak ada tikungan salah yang bisa dibuat. Tapi saya pikir ini menarik sebagai permulaan karena bergantung pada teori grafik.
Rutinitas sebenarnya membuat labirin tapi saya memasang semua lokasi kosong yang dapat menimbulkan siklus. Jika saya menemukan cara untuk menghapus siklus saya akan memasukkan kode itu di sini.