Number of Islands
地図は、長さが等しい行のリストとして与えられます。各文字は、陸地のマスを表す1か、水のマスを表す0のいずれかです。ある陸地のマスの真上、真下、真左、または真右に別の陸地のマスがある場合、これらのマスは同じ島に属します。角で触れているだけのマスはつながっていません。
地図["11000", "11000", "00100", "00011"]を見てみましょう。
- 左上の角にある4つの陸地のマスは、1つの島を形成します。
- 中央の行にある1つのマスは、最初の島とは角で触れているだけなので、2つ目の島です。
- 右下にある2つのマスは、3つ目の島を形成します。
つまり、この地図には3つの島があります。
この地図は実際にはグラフです。それぞれの陸地のマスがノードで、辺は辺を共有する2つの陸地のマスを結びます。島を数えることは、このグラフの連結した部分を数えることを意味します。まだ訪れていない陸地のマスを見つけるたびに、新しい島を見つけたことになり、次に進む前にその島全体を探索します。
numIslandsという名前の関数を作成してください。この関数は、1(陸地)と0(水)で構成された文字列のリストであるgridを受け取り、島の数を返します。島とは、上下左右に隣接してつながった陸地のマスの集まりです。
たとえば、["01110", "01000", "00011", "11001"]は3を返します。上の行にある形、右側の集まり、左下隅の2マスです。
制約:行数と列数は1以上150以下です。すべての行の長さは同じです。
関数
- arg1string-array
- 戻り値integer
例
- 入力
- arg1 = ["11000", "11000", "00100", "00011"]
- 出力
- 3
- 入力
- arg1 = ["01110", "01000", "00011", "11001"]
- 出力
- 3
提出時に隠しテスト+13件
ヒント
1つずつ開いてください。開くたびに少しずつ答えに近づきます。
地図を1マスずつ調べていきます。これまでどの島にも属していない陸地のマスにたどり着いたとき、新たにいくつの島を見つけたことになりますか?
新しい島を見つけたら、それにつながっている陸地のマスをすべて調べ、それぞれを訪問済みとしてマークします。そうすれば、走査時に同じ島を再び数えることはありません。
まだ訪れていないマスを、キュー(幅優先)または明示的なスタック(深さ優先)を使って探索します。島がひとつだけの巨大な地図では、再帰的な探索はコールスタックを使い果たすことがありますが、自分で用意したキューやスタックをループで処理する方法なら、その心配はありません。
この問題の詳しい解説は準備中です。
似た問題
同じ考え方を使う問題です。2〜3問解くとパターンが身につきます。
Python
def numIslands(grid):
# ここにコードを書いてくださいケース1
ケース2
入力
arg1 = ["11000", "11000", "00100", "00011"]
期待値
3