Обчисліть 3BV дошки тральщика


17

3BV з Сапер плати являє собою мінімальну кількість клацань , необхідних для вирішення ради , якщо ви вже знаєте рішення. Він розшифровується як "Оцінка бенчмаркової вартості ради Бехтеля". Ось його сайт пояснює це.

Нижче - вирішена дошка шахтника. Прапори позначають міни; плитки без мін вказують на кількість сусідніх шахт, включаючи діагонально, за винятком того, що плитки, які повинні мати "0", залишаються порожніми. На зображенні показано, на яку плитку потрібно натиснути, щоб вирішити дошку.

Підрахунок 3BV

Кліки, що зараховуються до 3BV:

  • По одному для кожного заповненого затопленнями ділянки порожню плитку (нульові міни, що прилягають) та їх непрозорих сусідів.
  • Один для одного не мінна плитка.

Інший приклад (3BV = 39)

Вирішено дошку тральщика Необхідні кліки


Враховуючи 2D масив значень 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's, а потім інвертується (використовуючи ~), яка ідентифікує всі точки, у яких немає шахт, як сусідів ( 1) або do ( 0). Для визначення кількості підключених регіонів ми використовуємоbwlabel для позначення кожної підключеної області 1s. Перший вихід - це матриця мітки ( 0де вхід дорівнював нулю і будь-яке значення в діапазоні, 1...Nде був 1вхід, де Nє індекс зв'язаної групи, до якої належить). Другий вихід - кількість регіонів (кількість кліків, необхідних для їх відкриття). Результат bwlabelпоказано на зображенні зліва.

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

Розширюємо перший результат bwlabelвикористання imdilate(усі ненулі розширені) за допомогою матриці 3 x 31 s. Результат показаний на зображенні посередині.

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


9

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

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

Це рішення створює анонімну функцію з назвою ans якій потім можна передавати 2D матрицю 0's і 1' s. Логіка така ж, як і моя відповідь 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.