Calcule o 3BV de um Quadro de Campo Minado

O 3BV de um O tabuleiro do Campo Minado representa o número mínimo de cliques com o botão esquerdo necessários para resolver o tabuleiro se você já conhece a solução. Significa ” Valor de referência da diretoria da Bechtel “. Aqui “s seu site explicando isso.

Abaixo está um quadro do Campo Minado resolvido. As bandeiras indicam minas; os ladrilhos sem minas indicam a contagem de minas adjacentes, inclusive diagonalmente, exceto que os ladrilhos que devem ter ” 0 ” são deixados em branco. A imagem mostra quais peças precisam ser clicadas para resolver o tabuleiro.

Contando 3BV

Os cliques contados para o 3BV são:

  • Um para cada área inundada de blocos em branco (zero minas adjacentes) e seus vizinhos não vazios.
  • Um para cada bloco não mine.

Outro exemplo (3BV = 39)

Quadro do Campo Minado resolvido Cliques necessários


Dada uma matriz 2D de valores, 0 para limpar e 1 para uma mina (ou um booleano), retornar o 3BV .

As dimensões de uma placa serão no mínimo 8×8 e no máximo 2 4×30, inclusive. Seu programa deve lidar com todas as placas possíveis, não apenas os exemplos.

Observação: uma placa nunca conterá apenas minas.

Exemplo de E / S:

[[0,0,0,0,0,0,0,0], [0,0,0,1,0,0,0,0], [0,0,0,1,0,0,1,0], [0,1,0,0,1,0,0,0], [0,0,1,0,0,0,0,1], [0,0,0,1,0,0,0,0], [0,0,0,0,0,0,1,0], [0,0,0,0,0,0,0,1]] 23 [[0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0], [0,0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,1,0,1,1,0,0,0,0,0,0], [0,1,0,0,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,1,1,0,0,0,1,0,1,0,1,0], [0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0], [0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0], [0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,1,0,1], [0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,1], [0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0], [0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0], [0,0,1,0,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0], [1,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1], [0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,1,1,0,0,0,0,1,1,0,0], [0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,1,0,1,1,0,0,0,1,0,0,0,1,1,0,0], [0,1,1,1,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0], [0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0], [0,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0]] 187 

Comentários

  • Uma matriz de inteiros está correta como entrada? Cada número inteiro codifica uma linha.
  • @KarlNapf Não. A entrada deve ser reconhecível como um quadro, conforme mostrado.
  • Você poderia fornecer mais casos de teste, possivelmente incluindo a entrada com base no imagens e talvez um caso de teste de dimensões máximas?

Resposta

MATLAB, 92 90 86 83 79 74 72 bytes

x=input("");I=@(x)~imdilate(x,ones(3));[C,N]=bwlabel(I(x));nnz(I(C)-x)+N 

Esta solução aceita a entrada na forma de uma matriz 2D de 0 “se 1” se exibirá o valor 3BV para a entrada fornecida.

Aqui está a demonstração levemente modificada no Octave para aqueles que não têm o MATLAB.

Explicação

A matriz de entrada é dilatada usando uma matriz 3 x 3 de 1 “se, em seguida, invertida (usando ~) que identifica todos os pontos que não têm minas como vizinhos (1) ou do (). Para determinar o número de regiões conectadas, usamos bwlabel para rotular cada região conectada de 1 “s. A primeira saída é a matriz de rótulo (0 onde a entrada era zero e qualquer valor no intervalo 1...N onde havia um 1 na entrada, onde N é o índice do grupo conectado ao qual pertence. A segunda saída é o número de regiões (o número de cliques necessários para abri-los). O resultado do bwlabel é mostrado na imagem à esquerda.

insira a descrição da imagem aqui

Expandimos a primeira saída de bwlabel usando imdilate (todos os não zeros são expandidos) usando uma matriz 3 x 3 de 1 “s. O resultado é mostrado na imagem no meio.

Para determinar os cliques restantes, contamos os quadrados que não estão nesta região expandida (~imdilate()) e não uma mina (-x) (quadrados brancos na imagem à direita) e adicione isso ao número total de regiões abertas (o número de cores diferentes na imagem à esquerda ) para obter o 3BV.

Resposta

Octave, 86 84 79 66 bytes

@(x)nnz(~imdilate(c=imerode(~x,o=ones(3)),o)-x)+max(bwlabel(c)(:)) 

Esta solução cria uma função anônima chamada ans que pode então ser passada uma matriz 2D de 0 “se 1” s. A lógica é a mesma da minha resposta MATLAB, mas usa alguns truques que o Octave tem a oferecer para economizar espaço.

Esta solução requer que o pacote image esteja instalado .

Demonstre aqui

Resposta

MATL, 24 22 21 bytes (não concorrentes )

1 byte salvo graças a @Luis

4Y6Z+~l2#ZIw7MZ+G+~z+ 

Experimente em MATL Online

Explicação

Novamente, isso é semelhante às minhas respostas do MATLAB e do Octave para esta pergunta.

 % Implicitly grab input array 4Y6 % Push the literal [1 1 1; 1 1 1; 1 1 1] to the stack Z+ % Perform 2D convolution of the input with this array ~ % Negate the result l2#ZI % Call bwlabeln which dilates each open region and the second output % returns the number of open regions w % Flip the top two stack elements 7M % Push the literal [1 1 1; 1 1 1; 1 1 1] to the stack again Z+ % Perform 2D convolution G+ % Explicitly grab the input and add it to the result ~z % Count the number of 0"s in the result (the remaining number of clicks) + % Add the total number of remaining clicks to the number of open regions 

Comentários

  • Não concorrente por quê?
  • @CalculatorFeline Infelizmente, a bwlabeln funcionalidade foi introduzida no MATL após o desafio foi postado.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *