Leetcoe 200. 島の個数C++深さ優先探索
11852 ワード
タイトルの説明
「1」(陸地)と「0」(水)からなる2次元メッシュを与え,島の数を計算した.1つの島は水に囲まれ、水平方向または垂直方向に隣接する陸地で接続されている.グリッドの4つのエッジが水で囲まれていると仮定できます.
例1:
例2:
に答える
本題の構想とLeetcode 79.単語検索C++(深さ優先検索&&遡及)の方法は同じです.深さ優先探索を使用して、所与のマトリクスgridのいずれかの位置の値が’1’であり、陸地であることを示す場合、深さ優先探索アルゴリズムを使用して、それに接続された陸地のすべてのタグを付ける.これで島が手に入ります.これにより,所与の行列gridを遍歴すると答えが得られる.注意:最初はgridの陸地が使用されたかどうかをマークするために同じ大きさのflag行列を申請するつもりです.しかし、実際には使わず、grid[i][j]の値を直接変更すればマークできることが分かった.
「1」(陸地)と「0」(水)からなる2次元メッシュを与え,島の数を計算した.1つの島は水に囲まれ、水平方向または垂直方向に隣接する陸地で接続されている.グリッドの4つのエッジが水で囲まれていると仮定できます.
例1:
:
11110
11010
11000
00000
: 1
例2:
:
11000
11000
00100
00011
: 3
に答える
本題の構想とLeetcode 79.単語検索C++(深さ優先検索&&遡及)の方法は同じです.深さ優先探索を使用して、所与のマトリクスgridのいずれかの位置の値が’1’であり、陸地であることを示す場合、深さ優先探索アルゴリズムを使用して、それに接続された陸地のすべてのタグを付ける.これで島が手に入ります.これにより,所与の行列gridを遍歴すると答えが得られる.注意:最初はgridの陸地が使用されたかどうかをマークするために同じ大きさのflag行列を申請するつもりです.しかし、実際には使わず、grid[i][j]の値を直接変更すればマークできることが分かった.
class Solution {
public:
int numIslands(vector<vector<char>>& grid) {
if(grid.empty()) return 0;//
int row=grid.size(), column=grid[0].size();
//vector> flag(row,vector(column,0));
int count=0;
for(int i=0;i<row;++i)
{
for(int j=0;j<column;++j)
{
if(grid[i][j]=='1')
{
count++;
grid[i][j]='2';// 2
dfs(grid,i,j);
}
}
}
return count;
}
void dfs(vector<vector<char>> &grid, int i, int j)
{
if(j+1<grid[0].size() && grid[i][j+1]=='1')
{
grid[i][j+1]='2';
dfs(grid,i,j+1);
}
if(i+1<grid.size() && grid[i+1][j]=='1')
{
grid[i+1][j]='2';
dfs(grid,i+1,j);
}
if(j-1>=0 && grid[i][j-1]=='1')
{
grid[i][j-1]='2';
dfs(grid,i,j-1);
}
if(i-1>=0 && grid[i-1][j]=='1')
{
grid[i-1][j]='2';
dfs(grid,i-1,j);
}
}
};