매스 매 티카 : 진정한 미로 (827 자)
원래는 {1,1,1}에서 {5,5,5}까지의 경로를 만들었지 만 잘못된 방향 전환이 없었기 때문에 포크 또는 "결정 지점"(도수> 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", "ooxox", "oooxx", "xooxx"}, { "oooxx", "ooxxo", "ooxox", "xoxoo", "xxxoo"}, { "oxxxx", "oooox", "xooox", "xoxxx", "oooxx"}, { "xxxxx", "ooxox", "oooox ","xoxoo ","oooxo "}}
후드
아래 그림은 ({{"ooxoo",...}}
위에 표시된 솔루션에 해당하는 미로 또는 미로를 보여줍니다 .
다음은 5x5x5에 삽입 된 동일한 미로 GridGraph
입니다. 번호가 매겨진 정점은 미로에서 가장 짧은 경로에있는 노드입니다. 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"}}
기술적으로 이것은 아직 진정한 미로가 아닙니다. 왜냐하면 사람이 할 수있는 잘못된 회전이 없기 때문입니다. 그러나 그래프 이론에 의존하기 때문에 시작으로 재미 있다고 생각했습니다.
루틴은 실제로 미로를 만들지 만 사이클을 일으킬 수있는 모든 빈 위치를 꽂았습니다. 사이클을 제거하는 방법을 찾으면 여기에 해당 코드를 포함시킵니다.