Одинокі острови


10

Вхід:

2D масив, що містить два різних (необов'язкові) значення. Я буду використовувати 0 і 1 при поясненні правил. Формат введення, звичайно, гнучкий.


Виклик:

Нулі - вода, а острівці. Щоб забезпечити самотність, ваше завдання - оточити всі острови водою, вставляючи рядки та стовпці нулів. Ви не хочете витрачати воду, тому потрібно мінімізувати кількість доданої води. Якщо є більше одного рішення, для якого потрібно однакова кількість води, то слід додати стовпчики води, а не рядки. Я покажу це в тестових випадках.


Вихід:

Новий, модифікований 2D масив. Вихідний формат, звичайно, гнучкий.


Тестові приклади:

Вхід і вихід розділені штрихами. Додані нулі відображаються жирним шрифтом. Скористайтеся однією з відповідей тут, якщо ви хочете перетворити тестові приклади у більш зручні формати.

1
---
1

1 1
---
1 0 1

1 1
1 1
---
1 0 1
0 0 0
1 0 1

1 0
0 1
---
1 0 0
0 0 1

Зауважте, що ми додали стовпчик нулів, а не ряд нулів. Це тому, що кількість необхідних нулів дорівнює, і слід віддавати перевагу стовпцям.


1 0 0 0 1
0 1 0 1 0
0 0 1 0 0
0 1 0 1 0
---
1 0 0 0 1
0 0 0 0 0
0 1 0 1 0
0 0 0 0 0
0 0 1 0 0
0 0 0 0 0
0 1 0 1 0

Зауважте, що ми додали рядки, а не стовпці, оскільки для цього потрібна найменша кількість зайвих нулів.


0 0 1 0 0
0 1 1 1 0
---
0 0 0 1 0 0 0
0 0 0 0 0 0 0
0 1 0 1 0 1 0

Це вимагало як стовпців, так і рядків.


0 0 1 0 0
0 1 0 1 0
---
0 0 0 1 0 0 0
0 1 0 0 0 1 0

Краще додати два стовпчики, ніж один ряд, оскільки для цього потрібно менше води.


0 0
1 0
0 1
1 0
0 0
---
0 0 
1 0
0 0 
0 1 
0 0 
1 0
0 0

Краще додати два ряди, ніж один стовпчик, оскільки для цього потрібно менше води.



Блін, Стюі, тепер у мене знову застряг "Джек Горобчик"!
Кудлатий

Ця проблема еквівалентна задачі про вершину на покритті двостороннього графіка, і згідно Вікіпедії її можна вирішити в поліноміальний час.
користувач202729

Я передумав ... це може бути зважено. У будь-якому випадку для досить великої квадратної матриці це (сподіваємось) еквівалент. Тож якщо ваш алгоритм "занадто простий", будьте обережні .
користувач202729

Я думаю, що у мене є поліноміальний алгоритм часу.
користувач202729

Відповіді:


2

Желе , 37 байт

ṫƤ-S€ZƊ⁺FỊẠ
Z_,,WƲ€ŒpẎ€Ʋ⁺€ẎLÞFL$ÞṚÇÞṪ

Спробуйте в Інтернеті!

Функція повертає 2D масив цілих чисел. Зауважте, що, природно, у списку Jelly singleton відображається як його значення, тому Gвоно використовується для форматування виводу.


  • Посилання 1: Повернення (дійсність).
  • Посилання 2: Основна програма.

Програма працює в експоненціальному часі, але поки що я не міг придумати жодного поліноміального алгоритму часу. Використання Ƥдіадіальної функції, ця функція вирішує завдання.


2

Python 2 , 374 346 340 339 323 317 байт

R=range;L=len
def f(a):
 w,h=L(a[0]),L(a);W=[]
 for i in R(2**w):
	A=zip(*a)
	for c in R(w):A[-c:-c]=[[0]*h]*(i&1<<c>0)
	for j in R(2**h):
	 B=zip(*A);x=L(B[0])
	 for r in R(h):B[-r:-r]=[(0,)*x]*(j&1<<r>0)
	 y=L(B);W+=[(w*h-x*y,x,B)]*all(sum(B[i][j:j+2]+B[i+1][j:j+2])<2for i in R(y-1)for j in R(x))
 return max(W)[2]

Спробуйте в Інтернеті!


Я думаю, що перший [:]можна видалити, не впливаючи на вихід.
користувач202729

@ user202729, спасибі, я думаю, що може. Я тим часом змінив його :)
TFeld
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.