Mathematica: True Labyrinth (827 caracteres)
Originalmente, produzi um caminho de {1,1,1} a {5,5,5}, mas como não havia possíveis desvios errados, introduzi garfos ou "pontos de decisão" (vértices de grau> 2) onde seria preciso decidir qual caminho seguir. O resultado é um verdadeiro labirinto ou labirinto.
Os "becos sem saída" eram muito mais difíceis de resolver do que encontrar um caminho simples e direto. A coisa mais desafiadora foi eliminar os ciclos no caminho, permitindo ciclos fora do caminho da solução.
As duas linhas de código a seguir são usadas apenas para renderizar os gráficos desenhados, portanto, o código não conta, pois não é empregado na solução.
o = Sequence[VertexLabels -> "Name", ImagePadding -> 10, GraphHighlightStyle -> "Thick",
ImageSize -> 600];
o2 = Sequence[ImagePadding -> 10, GraphHighlightStyle -> "Thick", ImageSize -> 600];
Código usado:
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]
Saída de amostra
{{"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 "}}
Sob o capô
A imagem abaixo mostra o labirinto ou labirinto que corresponde à solução ({{"ooxoo",...}}exibida acima:

Aqui está o mesmo labirinto inserido em um 5x5x5 GridGraph. Os vértices numerados são nós no caminho mais curto para fora do labirinto. Observe os garfos ou os pontos de decisão em 34, 64 e 114. Vou incluir o código usado para renderizar o gráfico, mesmo que não faça parte da solução:
HighlightGraph[gg = GridGraph[ConstantArray[5, 3]], g,
GraphHighlightStyle ->"DehighlightFade",
VertexLabels -> Rule @@@ Transpose[{s, s}] ]

E este gráfico mostra apenas a solução para o labirinto:
HighlightGraph[gg = GridGraph[ConstantArray[5, 3]],
Join[s, e[s]], GraphHighlightStyle -> "DehighlightFade", VertexLabels -> Rule @@@ Transpose[{s, s}] ]

Por fim, algumas definições que podem ajudar na leitura do código:

Solução original (432 caracteres, produziu um caminho, mas não um verdadeiro labirinto ou labirinto)
Imagine um cubo sólido de 5x5x5, composto por cubos de unidades distintas. O seguinte começa sem cubos de unidades em {1,1,1} e {5,5,5}, pois sabemos que eles devem fazer parte da solução. Em seguida, ele remove cubos aleatórios até que haja um caminho desimpedido de {1,1,1} para {5,5,5}.
O "labirinto" é o caminho mais curto (se mais de um for possível), considerando os cubos da unidade que foram removidos.
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]
Exemplo:
{{"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"}}
Tecnicamente, este ainda não é um verdadeiro labirinto, já que não há giros errados que alguém possa fazer. Mas achei interessante como um começo, uma vez que se baseia na teoria dos grafos.
A rotina realmente faz um labirinto, mas liguei todos os locais vazios que poderiam dar origem a ciclos. Se eu encontrar uma maneira de remover ciclos, incluirei esse código aqui.