Maze solving: Difference between revisions
Content added Content deleted
(Added Julia language) |
|||
Line 2,664: | Line 2,664: | ||
<script src="maze.js"></script></head><body onload="init()"></body></html> |
<script src="maze.js"></script></head><body onload="init()"></body></html> |
||
</pre> |
</pre> |
||
=={{header|Julia}}== |
|||
{{works with|Julia|0.6}} |
|||
{{trans|Python}} |
|||
<lang julia>""" |
|||
+ +---+---+ |
|||
| 1 2 3 | |
|||
+---+ + + |
|||
| 4 5 | 6 |
|||
+---+---+---+ |
|||
julia> const graph = [ |
|||
0 1 0 0 0 0; |
|||
1 0 1 0 1 0; |
|||
0 1 0 0 0 1; |
|||
0 0 0 0 1 0; |
|||
0 1 0 1 0 0; |
|||
0 0 1 0 0 0] |
|||
julia> dist, path = dijkstra(graph, 1) |
|||
(Dict(4=>3,2=>1,3=>2,5=>2,6=>3,1=>0), Dict(4=>5,2=>1,3=>2,5=>2,6=>3,1=>0)) |
|||
julia> printpath(path, 6) # Display solution of the maze |
|||
1 -> 2 -> 3 -> 6 |
|||
""" |
|||
function dijkstra(graph, source::Int=1) |
|||
# ensure that the adjacency matrix is squared |
|||
@assert size(graph, 1) == size(graph, 2) |
|||
inf = typemax(Int64) |
|||
n = size(graph, 1) |
|||
Q = IntSet(1:n) # Set of unvisited nodes |
|||
dist = Dict(n => inf for n in Q) # Unknown distance function from source to v |
|||
prev = Dict(n => 0 for n in Q) # Previous node in optimal path from source |
|||
dist[source] = 0 # Distance from source to source |
|||
function _minimumdist(nodes) # Find the less distant node among nodes |
|||
kmin, vmin = nothing, inf |
|||
for (k, v) in dist |
|||
if k ∈ nodes && v ≤ vmin |
|||
kmin, vmin = k, v |
|||
end |
|||
end |
|||
return kmin |
|||
end |
|||
# Until all nodes are visited... |
|||
while !isempty(Q) |
|||
u = _minimumdist(Q) # Vertex in Q with smallest dist[] |
|||
pop!(Q, u) |
|||
if dist[u] == inf break end # All remaining vertices are inaccessible from source |
|||
for v in 1:n # Each neighbor v of u |
|||
if graph[u, v] != 0 && v ∈ Q # where v has not yet been visited |
|||
alt = dist[u] + graph[u, v] |
|||
if alt < dist[v] # Relax (u, v, a) |
|||
dist[v] = alt |
|||
prev[v] = u |
|||
end |
|||
end |
|||
end |
|||
end |
|||
return dist, prev |
|||
end |
|||
function printpath(prev::Dict, target::Int) |
|||
path = "$target" |
|||
while prev[target] != 0 |
|||
target = prev[target] |
|||
path = "$target -> " * path |
|||
end |
|||
println(path) |
|||
end |
|||
const graph = [ |
|||
0 1 0 0 0 0; |
|||
1 0 1 0 1 0; |
|||
0 1 0 0 0 1; |
|||
0 0 0 0 1 0; |
|||
0 1 0 1 0 0; |
|||
0 0 1 0 0 0] |
|||
dist, path = dijkstra(graph) |
|||
printpath(path, 6)</lang> |
|||
=={{header|Mathematica}}== |
=={{header|Mathematica}}== |
||
Line 2,671: | Line 2,756: | ||
{{Out}} |
{{Out}} |
||
[[File:MathematicaMazeGraphSolving.png]] |
[[File:MathematicaMazeGraphSolving.png]] |
||
=={{header|Perl}}== |
=={{header|Perl}}== |
||
This example includes maze generation code. |
This example includes maze generation code. |