孤独な島々


10

入力:

2つの異なる(オプション)値を含む2D配列。ルールを説明するときは01を使用します。入力フォーマットはもちろん柔軟です。


チャレンジ:

ゼロは水であり、ゼロは島です。孤独を確実にするために、あなたの仕事はゼロの行と列を挿入することによってすべての島を水で囲むことです。水を無駄にしたくないので、追加する水の量を最小限に抑える必要があります。同じ量の水を追加する必要がある複数のソリューションがある場合は、行ではなく列を追加する必要があります。これをテストケースで示します。


出力:

新しく変更された2D配列。出力形式はもちろん柔軟です。


テストケース:

入力と出力はダッシュで区切られています。追加されたゼロは太字で示されています。テストケースをより便利な形式に変換する場合は、ここで回答の1つを使用してください。

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

必要な水が少ないため、1つの行よりも2つの列を追加する方が適切です。


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

必要な水が少ないため、1つの列よりも2つの行を追加する方が適切です。



ダムニット、スチューイ、今、私は再び「ジャック・スパロウ」を頭に突き刺した!
Shaggy

この問題は、2部グラフの頂点カバー問題と同等であり、Wikipediaによると、多項式時間で解決できます。
user202729

気が変わった...重み付けされているかもしれません。とにかく、十分に大きな正方行列の場合、(うまくいけば)同等です。したがって、アルゴリズムが「単純すぎる」場合は注意してください
user202729

私は多項式時間アルゴリズムを持っていると思います。
user202729

回答:


2

ゼリー、37バイト

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

オンラインでお試しください!

整数の2D配列を返す関数。Jellyでは、当然、シングルトンリストが値として表示されるためG、出力のフォーマットに使用されます。


  • リンク1:リターン(有効性)。
  • リンク2:メインプログラム。

プログラムは指数時間で実行されますが、これまでのところ、多項式時間アルゴリズムは考えられませんでした。Ƥダイアディック関数を使用します。この機能は、チャレンジの日付を変更します。


2

パイソン2374の 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]

オンラインでお試しください!


最初のもの[:]は出力に影響を与えずに削除できると思います。
user202729

@ user202729、ありがとうございます。できると思います。とりあえず変更しました:)
TFeld 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.