二次元の「1」(ランド)によってグリッドと「0」(水)の組成物を与えられた、島の数が計算されます。島は水に囲まれ、水平または垂直方向に隣接するランドに接続されているを通してです。あなたは、グリッドの四方を囲む水があると仮定することができます。
例1:
入力:
11110
11010
11000
00000
出力:1
例2:
入力:
11000
11000
00100
00011
出力:3
出典:滞在ボタン(LeetCode)
リンクします。https://leetcode-cn.com/problems/number-of-islands
すべてのネットワークからの控除が著作権を保有。商業転載は、ソースを明記してください許可公式、非商用の転載をご連絡ください。
オーバーフローエラーが発生したので、.size [0]()にxとyと対応grid.sizeに混乱、コピーので、過去に行っているため()、及びgirdはエラーをチェックするために長い時間がかかりました。
クラス解決{ パブリック: 構造体キュー{ INT X [ 30000 ]。 INT Y [ 30000 ]。 int型のヘッド、テール; } QQQ。 int型訪れた[ 1000年 ] [ 1000年]。 INTエンキュー(INT O、INT P、ベクトル<ベクトル< チャー >>&グリッド){ もし、((qqq.tail + 1)%500 == qqq.head){ 戻り 0 。 } であれば(O < 0|| O> = grid.size()|| P < 0 || P> =グリッド[ 0 ] .size()){ 戻り 0 。 } もし(訪問[O] [P] =!0 ||グリッド[O] [P] == ' 0 ' ){ 戻り 0 。 } COUT << O << " " << P << " エンキュー\ n " 。 qqq.x [qqq.tail] = O。 qqq.y [qqq.tail] = P。 訪問[O] [P] = 1 。 qqq.tail ++ ; リターン 1 ; } int型のデキュー(){ 場合(qqq.head == qqq.tail){ 戻り 0 。 } qqq.head ++ 。 リターン 1 ; } BOOL のisEmpty(){ 場合(qqq.head == qqq.tail){ 戻り 真。 } を返す 偽。 } int型 numIslands(ベクトル<ベクトル< チャー >>&グリッド){ 場合(grid.size()== 0 ||グリッド[ 0 ] .size()== 0)リターン 0 ; int型のカウント= 0 ; qqq.head = 0 ; qqq.tail = 0 ; INT F、G。 int型私は、jは、 以下のための(iは= 0 ; I <grid.size(); I ++ ){ ため(J = 0 ; J <グリッド[I] .size(); J ++ ){ [J] [i]を訪問 = 0 。 } } のための(iは= 0を I ++; I <grid.size(){}) のための(j = 0 ; J <グリッド[I] .size(); J ++ ){ もし(グリッド[I] [J] == ' 1 ' &&訪問[I] [J] == 0 ){ エンキュー(I、J、グリッド)。 一方、(!のisEmpty()){ F = qqq.x [qqq.head]。 G = qqq.y [qqq.head]。 訪問[F] [G] =カウント+ 1 。 デキュー(); エンキュー(F - 1 、G、グリッド)。 エンキュー(F + 1 、G、グリッド)。 エンキュー(F、G + 1 、グリッド)。 エンキュー(F、G - 1、グリッド); } カウント ++ ; } } } リターン回数、 } }。