Рассчитайте 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

В порядке ли массив целых чисел? Каждое целое число кодирует одну строку.
— Карл Напф

@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.


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пакет был установлен.

Демо здесь


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 

Неконкурентный почему?
— CalculatorFeline

1
@CalculatorFeline К сожалению, bwlabelnфункциональность была введена в MATL после того, как задание было опубликовано.
— Suever
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.