Desafio
Escreva um programa / função que aceite uma "imagem" e produza um labirinto de figuras formado a partir dessa imagem.
Entrada
Seu programa deve aceitar dois argumentos:
- Eu, a imagem para formar o labirinto de
- S, um booleano que especifica se deve ou não exibir a solução para o labirinto
Eu recebo da seguinte forma:
.......
.#####.
.#####.
#######
.#####.
.#####.
.......
onde #
são células a serem incluídas no caminho da solução e .
são células a serem excluídas. Você pode trocar os .
', #
' e novas linhas com qualquer caractere de sua escolha, desde que sejam diferentes um do outro. Como alternativa, você pode aceitar um bitmap real da imagem de entrada.
Saída
Seu labirinto resultante deve estar da seguinte forma:
###############
# #
# ### ####### #
# #.........# #
# #.#######.# #
# #.#.......# #
###.#.#########
....#.#........
#####.#.#######
# ...#..... #
# #.#######.# #
# #.........# #
# ####### ### #
# # # #
###############
onde #
denotam paredes, .
denotam partes do caminho que fazem parte da solução e espaços são caminhos excluídos da solução. Os .
podem ser substituídos por espaços se S for falso. Novamente, os caracteres podem ser trocados por outros de sua escolha ou você pode gerar um bitmap real do labirinto com a solução destacada.
detalhes adicionais
- Os caminhos devem ter uma célula de largura (não pode haver um pool gigante de espaço vazio como o caminho)
- O labirinto não deve conter nenhum laço
- O labirinto deve estar totalmente conectado (todas as células devem estar acessíveis a partir da entrada / saída)
- O labirinto deve ser cercado por paredes (a menos que seja uma entrada / saída)
- O caminho da solução não deve incluir becos sem saída
- Deve haver exatamente 1 entrada e 1 saída para o labirinto
- A entrada e a saída devem estar alinhadas com a borda da grade e adjacentes a uma célula incluída no caminho da solução
- Você pode escolher onde a entrada e a saída são colocadas
- Você pode assumir que um caminho válido pode ser formado a partir da imagem de entrada fornecida
(Adicionado para esclarecimento) O diagrama abaixo mostra como o caminho da solução está correlacionado à imagem de entrada:
Input (I): | Output: | Corresponding Cells:
| | (@'s denote #'s from I)
| |
....... | ############### | ###############
.#####. | # # | # #
.#####. | # ### ####### # | # ### ####### #
####### | # #.........# # | # #@.@.@.@.@# #
.#####. | # #.#######.# # | # #.#######.# #
.#####. | # #.#.......# # | # #@#@.@.@.@# #
....... | ###.#.######### | ###.#.#########
| ....#.#........ | .@.@#@#@.@.@.@.
| #####.#.####### | #####.#.#######
| # ...#..... # | # @.@#@.@.@ #
| # #.#######.# # | # #.#######.# #
| # #.........# # | # #@.@.@.@.@# #
| # ####### ### # | # ####### ### #
| # # # # | # # # #
| ############### | ###############
| |
Casos de teste
Exemplo de regador da Wikipedia :
Entrada:
..................
..................
.......####.......
......##..##......
.....##....##....#
.....#......#...##
.#############.##.
##..############..
#...###########...
#...##########....
#...##########....
#...##########....
#...##########....
....##########....
....##########....
....##########....
..................
..................
Saída (S = false):
#####################################
# # # # # # #
# ### ### ### # # ##### ### ### ### #
# # # # # # # # # # #
# ### # ##### # ########### # ### # #
# # # # # # # # #
# # # ### ##### # ### ### # ### ### #
# # # # # # # # # # # # #
# ### # ##### ##### ### ##### # # ###
# # # # # # # # #
### ####### ### ### # ### ##### ### #
# # # # # # # # # # #
# ### ##### # ### ####### # # # # # #
# # # # # # # #
# # ##### ############# ### ### ### #
# # # # # # # # # #
# ### # ####### # ### ### # # ### # #
# # # # # # # # # #
# # # ### ######### # # ##### # #####
# # # # # # # # # # # #
# ##### # # ##### # ##### # # ### # #
# # # # # # # # # # #
# ### ### ### # ### # ##### ####### #
# # # # # # # # # #
# # # # ####### # ### # ##### # ### #
# # # # # # # # # # #
### # # # # # ############# # ### # #
# # # # # # # # # # #
##### # # ##### ####### # ### ##### #
# # # # # # # # #
##### # # # # ####### # ### #########
# # # # # #
# ### ######### ############# # #####
# # # # # # # # #
# # ######### # ####### ####### ### #
# # # #
#####################################
Saída (S = verdadeiro):
#####################################
# # # # # # #
# ### ### ### # # ##### ### ### ### #
# # # # # # # # # # #
# ### # ##### # ########### # ### # #
# # # #....... # # # # #
# # # ### #####.# ###.### # ### ### #
# # # # #...# # #...# # # # #
# ### # #####.##### ###.##### # # ###
# # # ...# # #... # # #..
### #######.### ### # ###.##### ###.#
# # #.# # # #.# # #...#
# ### #####.# ### #######.# # # #.# #
# #.......#.............#...# #...# #
# #.#####.#############.###.###.### #
#...# #.......#.....#...#.#...# # #
#.### # #######.#.###.###.#.#.### # #
#.# # # .......#...#.#...#...# #
#.# # ###.#########.#.#.##### # #####
#.# # #.#.......#.#...#...# # # #
#.##### #.#.#####.#.#####.#.# ### # #
#. #.#...#...#.#.....#.# # # #
#.### ###.###.#.###.#.#####.####### #
#. # # #.....#.#...#.#..... # #
#.# # # #######.#.###.#.##### # ### #
..# # # #...#...#.....#.....# # # #
### # # #.#.#.#############.# ### # #
# # # #.#...#.........#...# # # #
##### # #.#####.#######.#.### ##### #
# # #.#...#.......#.#...# #
##### # #.#.#.#######.#.###.#########
# # ...#.........#..... # #
# ### ######### ############# # #####
# # # # # # # # #
# # ######### # ####### ####### ### #
# # # #
#####################################
Exemplo de bitmap (mesmo labirinto que acima):
fonte
Respostas:
Python 3, 1599 bytes
Achei esse projeto divertido e muito interessante (e um tanto demorado). Quando vi isso, lembrei-me do verão em que passei exclusivamente escrevendo e aprimorando um algoritmo de geração de labirinto e instantaneamente comecei a trabalhar nisso.
Depois de um tempo, eu tinha um rascunho inicial de cerca de 6000 bytes e passei as próximas horas condensando-o no seguinte programa:
O que é tão absurdo de se olhar quanto um labirinto de arte-ascii é ...
É importante notar que, como a função aleatória não é usada até depois que o caminho correto foi encontrado, não importa quantas vezes a mesma entrada seja fornecida, a rota do início ao fim será a mesma e, enquanto este programa Se você trabalhar nos exemplos acima, às vezes será incapaz de encontrar uma solução se, por assim dizer, "se atirar contra uma parede".
Ao executar os exemplos acima, ele fornece o seguinte:
isto:
e isto:
Para quem gostaria de tentar executar este programa-se, use o comando
M(Image, Show solution)
. Eu recomendaria usar as aspas triplas para inserir a imagem, caso contrário, haverá muitas barras invertidas ou caracteres de nova linha envolvidos.fonte
0
vez depass
,l.append(a);l.append(b)
->l+=a,b
,l.append(a)
->l+=[a]
, pode valer'#'
a pena atribuir a uma variável, edef E(G,y,z):\n c=[]
->def E(G,y,z,c=[]):
if G[r][c]==1 or G[r][c]==2:
->if 0<G[r][c]<3:
,s=[0]\n for x in R(L(I[0])*2):s+=[0]
->s=[0]*(1+L(I[0])*2)
e (acho que ainda não testei)G=[s]
->*G=s
.except:0
,l+=a,b
es=[0]*(1+L(I[0])*2)
realmente ajudou. Infelizmente, por qualquer motivo, atribuir c na chamada de função não a redefine em várias chamadas, o que significa que parou de funcionar, G [r] [c] pode ser uma string, então não posso usar <ou> nela e o * G = s me deu um erro de sintaxe. Ainda assim, um ótimo conselho.G[r][c]
puder ser uma string,G[r][c]in[1,2]
deve funcionar.