O quebra-cabeça
- Imprima 0 se um labirinto n * m não puder ser resolvido
- Imprima 1 se um labirinto n * m puder ser resolvido (de 1 ou mais maneiras)
(por isso não estou pedindo caminhos, mas se é possível resolver !!!)
Matriz de entrada (2d):
[[0,0,0,0,0,0,1],[0,0,0,0,0,1,0],[0,0,0,0,1,0,0],[1,0,0,0,0,0,0]]
XXXXXXXXX
XS XX
X X X
X X X
XX FX
XXXXXXXXX
0 = can pass through
1 = can not pass trough
[0][n] is the last block of the first line
[m][0] is the first block of the last line
Regra A posição inicial é 0,0 e a posição final é n, m Você só pode se mover horizontalmente e verticalmente.
Respostas:
CJam,
4241393635 bytesCom base nas idéias nesta resposta .
4 bytes graças ao Optimizer.
Formato de entrada:
fonte
q2Wts~_s,{{[{_2$+0<{e<_}*}*]}%z}*sW=
- 36. Embora assuma que os três primeiros caracteres da entrada serão[[0
Dyalog APL, 27 caracteres
⊃⌽∨.∧⍨⍣≡1≥+/¨|∘.-⍨,(~×⍳∘⍴)⎕
⎕
entrada avaliada. APL distingue entre uma matriz e um vetor de vetores. Este programa assume que a entrada é uma matriz.(~×⍳∘⍴)A
é um garfo equivalente a(~A) × ⍳⍴A
. É necessário evitar mencionar⎕
duas vezes ou introduzir uma variável.⍴A
é a forma deA
. Para uma matriz de 4 por 7, a forma é4 7
.⍳
é o gerador de índice.⍳4
é1 2 3 4
.⍳4 7
são os vetores(1 1)(1 2)...(4 7)
dispostos em uma matriz de 4 por 7.~A
vira os bits deA
.×
multiplicando⍳⍴A
pelos bits invertidos, preservamos as coordenadas de todas as células livres e transformamos todas as paredes em0 0
.,
percorre a matriz de pares de coordenadas, ou seja, a lineariza em um vetor. Nesse caso, o vetor será composto por pares.∘.-⍨A
ouA∘.-A
subtrai elementos deA
pares. Observe que aqui os elementos deA
são eles próprios pares.|
valor absoluto+/¨
somar cada par de valores absolutos. Isso nos dá as distâncias da grade entre cada par de células no labirinto, exceto as paredes.1≥
estamos interessados apenas nos vizinhos a uma distância não superior a 1, isso também exclui muros. Agora temos a matriz de adjacência de um gráfico.∨.∧⍨⍣≡
Floyd - algoritmo de fechamento transitivo de Warshall(f⍣n)A
(não usado aqui) onden
um número inteiro é o operador de energia. Aplica-sef
aA
n
tempos:f f ... f A
.(f⍣g)A
Ondeg
é uma função, é o operador de ponto fixo, também conhecido como "limite de potência". Ele continua a calcular a sérieA
,f A
,f f A
, ... até que((f⍣i)A) g ((f⍣(i+1))A)
retorna true para algunsi
. Nesse caso, usamos match (≡
) comog
.∨.∧⍨A
ouA∨.∧A
é um passo no algoritmo de Floyd.f.g
é uma generalização da multiplicação de matrizes (+.×
), aqui usamos conjunção (∧
) e disjunção (∨
) no lugar de+
e×
.⊃⌽
Depois de⍣≡
aplicar a etapa várias vezes e atingir um estado estável, devemos procurar o canto superior direito da matriz para obter o resultado, então giramos (⌽
) e pegamos o primeiro item superior esquerdo (⊃
).Visualização das
⍣≡
etapasfonte
Python, 164 bytes
Eu relutava em postar isso porque é praticamente como eu normalmente faria o preenchimento de inundação, apenas um pouco de golfe. Mas aqui está, de qualquer forma.
fonte
Perl, 73 bytes
69 bytes de código + 4 bytes para
-n0E
(não tenho certeza de como as tags eram contadas em 2014, então eu as contei para 4 em vez de 2, mas isso não importa muito).Experimente online! (e se você substituir a
1111011
linha por1111111
, o labirinto não poderá mais ser solucionado e a saída será em0
vez de1
: Experimente on-line! )Explicações:
Este código encontrará todas as células acessíveis do labirinto (e marque-as com a
A
): se uma célula toca uma célula marcada com aA
, é alcançável e também a marcamosA
; e fazemos isso de novo (redo
). Isso é feito graças a duas expressões regulares:s/(^0|A)(.{@{+}})?0/A$2A/s
verifica se um espaço está à direita ou na parte inferior de aA
, enquantos/0(.{@{+}})?A/A$1A/s
verifica se há um espaço à esquerda ou na parte superior de aA
. No final, se a última célula contém umA
, é alcançável, caso contrário, não é (é isso quesay/A$/+0
verifica; o+0
está aqui para garantir que o resultado será0
ou em1
vez de uma string vazia e1
).Observe que
/.*/
corresponderá a uma linha inteira, configurando assim@+
ao índice do final da primeira linha, que passa a ser o tamanho de uma linha, que permite usar.{@{+}}
para combinar exatamente o número de caracteres que há em uma linha. (@{+}
é equivalente a@+
, mas apenas o primeiro pode ser usado no regex)fonte
1
.Ruby,
133130129 caracteresEntrada em STDIN, saídas
1
ou0
em STDOUT.Irritantemente longo. Ele simplesmente faz uma inundação de
1
s de(0, 0)
e depois verifica se o quadrado "final" é a1
.fonte
Java, 418 bytes
Meu primeiro código de golfe. Não sei por que escolhi o Java - é tão ruim para o golfe xD
Um exemplo de labirinto seria inserido via stdin assim:
fonte
String[]
ea
, e pegar as informações de argumentos de linha de comando em vez de StdIn, o que é permitido.Python 184
188Isso ficou muito mais longo do que eu pensava :( De qualquer forma, adicionarei uma explicação quando não puder mais jogar golfe.
fonte
J, 75 caracteres
Alimentação da matriz de adjacência (muito tempo e memória ineficientes). (É chamado de alimentação em inglês?)
Alguns casos de teste:
fonte
Python 3 , 147 bytes
Experimente online!
Porto da minha resposta para encontrar a rota mais curta em uma estrada ASCII .
fonte
Python 3 , 184 bytes
Experimente online!
fonte