Рассчитайте 3BV доски тральщика

17

3BV из Сапер платы представляет собой минимальное количество щелчков , необходимых для решения совета , если вы уже знаете решение. Это расшифровывается как «Bechtel Board Benchmark Value». Вот его сайт, объясняющий это.

Ниже приведена решенная доска Сапер. Флаги обозначают мины; плитки без мин указывают количество соседних мин, в том числе по диагонали, за исключением того, что плитки, которые должны иметь «0», оставляются пустыми. На рисунке показано, какие плитки нужно щелкнуть, чтобы решить план.

Считая 3BV

Клики, подсчитанные в пользу 3BV:

  • Один для каждой заполненной области пустых плиток (ноль мин рядом) и их непустых соседей.
  • Один за другим не мой плитки.

Другой пример (3BV = 39)

Решенная доска тральщика Требуются клики


Учитывая двумерный массив значений, 0для очистки и 1для шахты (или логического значения), вернуть 3BV .

Размеры доски будут не менее 8х8 и не более 24х30 включительно. Ваша программа должна обрабатывать все возможные доски, а не только примеры.

Примечание: доска никогда не будет содержать только мины.

Пример ввода / вывода:

[[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
mbomb007
источник
В порядке ли массив целых чисел? Каждое целое число кодирует одну строку.
Карл Напф
@KarlNapf Нет. Вход должен быть распознан как доска, как показано на рисунке.
mbomb007
Не могли бы вы предоставить больше тестовых случаев, возможно, включая ввод данных на основе отображаемых изображений, и, возможно, тестовый пример максимального размера?
миль

Ответы:

15

MATLAB, 92 90 86 83 79 74 72 байта

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

Это решение принимает входные данные в виде 2D-матрицы 0 и 1 и отображает значение 3BV для предоставленного входного сигнала.

Вот немного модифицированный демо в Octave для тех из вас, кто не имеет MATLAB.

объяснение

Входная матрица расширяется с использованием матрицы 3 x 3, 1а затем инвертируется (используя ~), которая идентифицирует все точки, которые не имеют мин как соседей ( 1) или do ( 0). Чтобы определить количество связанных областей, мы используем bwlabelдля обозначения каждой связанной области 1's. Первый выход - это матрица меток ( 0где вход был нулевым, а любое значение в диапазоне, 1...Nгде был 1вход на входе, N- это индекс подключенной группы, к которой он принадлежит). Второй вывод - это количество регионов (количество кликов, необходимое для их открытия). Результат bwlabelпоказан на изображении слева.

введите описание изображения здесь

Мы расширяем первый результат bwlabelиспользования imdilate(все ненулевые элементы расширяются), используя матрицу 3 x 3 1. Результат показан на изображении посередине.

Чтобы определить оставшиеся клики, мы затем подсчитаем квадраты, которые не находятся в этой расширенной области ( ~imdilate()), а не мину ( -x) (белые квадраты на изображении справа) и добавим это к общему количеству открытых областей (число разные цвета на изображении слева), чтобы получить 3BV.

Suever
источник
9

Октава, 86 84 79 66 байт

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

Это решение создает анонимную функцию с именем, ansкоторой затем можно передать двумерную матрицу 0's и 1'. Логика та же, что и в моем ответе на MATLAB, но использует несколько приемов, которые Octave предлагает для экономии места.

Это решение требует, чтобы imageпакет был установлен.

Демо здесь

Suever
источник
2

MATL, 24 22 21 байт (не конкурирует)

1 байт сохранен благодаря @Luis

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

Попробуйте это на MATL Online

объяснение

Опять же, это похоже на мои ответы MATLAB и Octave на этот вопрос.

        % 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 
Suever
источник
Неконкурентный почему?
CalculatorFeline
1
@CalculatorFeline К сожалению, bwlabelnфункциональность была введена в MATL после того, как задание было опубликовано.
Suever