leetcode【200】【tag DFS】Number of Islands【c++版本,遞歸與非遞歸】

問題描述:

Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is surrounded by water and is formed by connecting adjacent lands horizontally or vertically. You may assume all four edges of the grid are all surrounded by water.

Example 1:

Input:
11110
11010
11000
00000

Output: 1

Example 2:

Input:
11000
11000
00100
00011

Output: 3

源碼:

題目意思就是找一下一共有多少個島嶼呢?注意周邊溢出的部分全部算0。

知道小編第一眼看到這個啥想法嘛,這不17年藍橋杯湖北省賽A組的題目嘛,當年小編我實力不濟,好不容易編出來,結果把題目看錯了,漏了個條件,最後很遺憾(其實也怪我菜)。

這題一看就是DFS,不斷的找新的島嶼,用一個visit矩陣存着當前點是否訪問過的標識。展示一下比較cuo的寫法:

class Solution {
public:
    int count = 0;
    int x[4]={-1,0,1,0};
    int y[4]={0,1,0,-1};
    void DFS(vector<vector<char>>& grid, int row, int col, vector<vector<bool>>& visit){
        visit[row][col] = true;
        for(int i=0; i<4; i++){
            int xd = row+x[i];
            int yd = col+y[i];
            if(xd>=0 && xd<visit.size() && yd>=0 && yd<visit[0].size() && !visit[xd][yd] && grid[xd][yd]=='1'){
                DFS(grid, xd, yd, visit);
            }
        }
    }
    
    int numIslands(vector<vector<char>>& grid) {
        int m=grid.size();
        if(m==0)    return 0;
        int n = grid[0].size();
        vector<vector<bool>> visit(m, vector<bool>(n, false));
        for(int i=0; i<m; i++){
            for(int j=0; j<n; j++){
                if(!visit[i][j] && grid[i][j]=='1'){
                    count++;
                    DFS(grid, i, j, visit);   
                }
            }
        }
        return count;
    }
};

是不是很冗餘,那就寫的規整點吧,而且也不用visit了,直接在原數組分配成'2'表示訪問過了:

class Solution {
public:
    void DFS(vector<vector<char>>& grid, int row, int col){
        int n=grid.size(), m=grid[0].size();
        grid[row][col] = '2';
        if(row-1>=0 && grid[row-1][col]=='1')      DFS(grid, row-1, col);
        if(row+1< n && grid[row+1][col]=='1')      DFS(grid, row+1, col);
        if(col-1>=0 && grid[row][col-1]=='1')      DFS(grid, row, col-1);
        if(col+1< m && grid[row][col+1]=='1')      DFS(grid, row, col+1);
    }
    
    int numIslands(vector<vector<char>>& grid) {
        int m=grid.size();
        if(m==0)    return 0;
        int n = grid[0].size(), count=0;
        for(int i=0; i<m; i++){
            for(int j=0; j<n; j++){
                if(grid[i][j]=='1'){
                    count++;
                    DFS(grid, i, j);   
                }
            }
        }
        return count;
    }
};

看完了遞歸,就來看看非遞歸的版本吧,這個也就是把非遞歸深搜改了一下。

class Solution {
public:  
    int numIslands(vector<vector<char>>& grid) {
        int m=grid.size();
        if(m==0)    return 0;
        int n = grid[0].size(), count=0;
        stack<pair<int, int>> st;
        for(int i=0; i<m; i++){
            for(int j=0; j<n; j++){
                if(grid[i][j]=='1'){
                    count++;
                    st.push(make_pair(i, j));
                    while(!st.empty()){
                        auto tmp = st.top();
                        st.pop();
                        int row = tmp.first, col = tmp.second;
                        if(grid[row][col] == '2')       continue;
                        // cout<<row<<" "<<col<<endl;
                        grid[row][col] = '2';
                        if(row-1>=0 && grid[row-1][col]=='1')      st.push(make_pair(row-1, col));
                        if(row+1< m && grid[row+1][col]=='1')      st.push(make_pair(row+1, col));
                        if(col-1>=0 && grid[row][col-1]=='1')      st.push(make_pair(row, col-1));
                        if(col+1< n && grid[row][col+1]=='1')      st.push(make_pair(row, col+1));
                    }
                }
            }
        }
        return count;
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章