2013-07-11 2 views
-1

Я пытаюсь вытащить массив всех удаленных стен из этого кода генерации лабиринта. Кажется, он не работает, когда я прошу его распечатать, он даст мне всю решетку лабиринта, а не конкретные стены, о которых я прошу.Как получить массив удаленных стен из кода генерации лабиринта Mathematica

MazeGen2[m_, n_] := 
    Block[{$RecursionLimit = Infinity, 
    unvisited = Tuples[Range /@ {m, n}], maze, mazearray = {}, 
    mazeA}, 
    (*unvisited=Delete[unvisited,{{1},{2},{Length[ 
    unvisited]-1},{Length[unvisited]}}];*) 
    (*Print[unvisited];*) 

    maze = {{{{#, # - {0, 1}}, {#, # - {1, 0}}}} & /@ 
     unvisited, {{{0, n - 1}, {0, 0}, {m - 1, 
     0}}}};(*This generates the grid*) 
    Print[maze]; 
    {unvisited = DeleteCases[unvisited, #]; 
     (*Print[unvisited];*) 
     Do[ 
     If[MemberQ[unvisited, neighbor], 
     maze = DeleteCases[ 
      maze, {#, neighbor - {1, 1}} | {neighbor, # - {1, 1}}, {5}] 
     (*mazeA=Flatten[AppendTo[mazearray, 
     maze]];*) 
     ; #[email protected]], 
     {neighbor, 
     [email protected]{# + {0, 1}, # - {0, 1}, # + {1, 0}, # - {1, 
      0}}} 
     ] 
     } &@[email protected]; 

    Flatten[maze] 
    ]; 
+1

Я слишком ленив, чтобы вырезать и вставить фрагмент, который содержит код с комментариями, присутствие которого просто затрудняет понимание вашей функции. –

+1

Я слишком ленив, даже чтобы прочитать комментарий @ HighPerformanceMark –

+0

Я предлагаю вам (попробуйте) написать код, чтобы нарисовать свой лабиринт. Вы обнаружите, что ваша начальная сетка взломана. – agentp

ответ

1

Я разыскал свой код на Rosetta Code сайте, а также - в благодарность за это! - вот как использовать графическую альтернативу для генерации лабиринта. Это любезно пользователя AlephAlpha:

MazeGraph[m_, n_] := 
Block[{$RecursionLimit = Infinity, grid = GridGraph[{m, n}], 
visited = {}}, 
Graph[Range[m n], 
Reap[{AppendTo[visited, #]; 
    Do[ 
     If[FreeQ[visited, neighbor], 
     Sow[# <-> neighbor]; #[email protected]], 
     {neighbor, [email protected][grid, #]}]} & @ 
    [email protected]@grid][[2, 1]], 
GraphLayout -> {"GridEmbedding", "Dimension" -> {m, n}}, 
EdgeStyle -> Directive[Opacity[1], AbsoluteThickness[12], Purple], 
VertexShapeFunction -> None, 
VertexLabels -> "Name", 
VertexLabelStyle -> White, 
Background -> LightGray, 
ImageSize -> 300]]; 

width = height = 8; 

maze = MazeGraph[width, height] 

maze

Solutions теперь легко, что лабиринт представляет собой график:

path = FindShortestPath[maze, 1, Last[VertexList[maze]]]; 
solution = Show[ 
    maze, 
    HighlightGraph[ 
    maze, 
    PathGraph[path], 
    EdgeStyle -> Directive[AbsoluteThickness[5], White], 
    GraphHighlightStyle -> None] 
    ]; 

, а также легко, чтобы найти удаленные стены - здесь это GraphDifference между оригиналом GridGraph и лабиринтом:

hg = HighlightGraph[ 
    GridGraph[{width, height}, 
    EdgeStyle -> 
    Directive[Opacity[0.2], Blue, AbsoluteThickness[1]]], 
    EdgeList[GraphDifference[GridGraph[{width, height}], maze]], 
    Background -> LightGray, 
    ImageSize -> 300, 
    GraphHighlightStyle -> {"Thick"}]; 

Показаны все три:

Row[{Labeled[maze, "maze"], Spacer[12], Labeled[hg, "deleted walls"], 
    Labeled[solution, "solution"]}] 

enter image description here

Извинения для вопросов моделирования - это сложная часть с использованием графиков ... :)

+0

Не должен ли путь проходить между стенами? (только по сравнению с версией версии розетты). – agentp

+0

@george, как я ее видел, стены серые, коридоры фиолетовые, решение белое. Таким образом, удаленные стены фактически удалены коридорами .. :) – cormullion

+0

+ для поиска источника .. – agentp