连通块

岛屿数量(连通块)

https://leetcode.cn/problems/number-of-islands/description/?envType=study-plan-v2&envId=top-100-liked
给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

示例 1:
输入:grid = [
["1","1","1","1","0"],
["1","1","0","1","0"],
["1","1","0","0","0"],
["0","0","0","0","0"]
]
输出:1

示例 2:
输入:grid = [
["1","1","0","0","0"],
["1","1","0","0","0"],
["0","0","1","0","0"],
["0","0","0","1","1"]
]
输出:3

提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 300
grid[i][j] 的值为 '0' 或 '1'

class Solution {
public:
    int vis[310][310];
    int dx[4]={0,0,1,-1};
    int dy[4]={-1,1,0,0};
    int ans=0,n,m;
    void dfs(vector<vector<char>>& grid,int x,int y,int p){
        vis[x][y]=p;
        for(int i=0;i<4;i++){
            int xx=x+dx[i];
            int yy=y+dy[i];
            if(xx>=0&&xx<n&&yy>=0&&yy<m&&vis[xx][yy]==0&&grid[xx][yy]=='1'){
                dfs(grid,xx,yy,p);
            }
        }
    }
    int numIslands(vector<vector<char>>& grid) {
        n=grid.size();
        m=grid[0].size();
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(!vis[i][j]&&grid[i][j]=='1'){
                    ans++;
                    dfs(grid,i,j,ans);
                }
            }
        }
        return ans;
    }
};

甲板上的战舰

给你一个大小为\(m \times n\)的矩阵\(board\)表示甲板,其中,每个单元格可以是一艘战舰\('X'\)或者是一个空位 \('.'\),返回在甲板\(board\)上放置的 战舰 的数量。

战舰 只能水平或者垂直放置在 board 上。换句话说,战舰只能按\(1 \times k(1 行,k 列)\)\(k \times 1(k 行,1 列)\)的形状建造,其中 k 可以是任意大小。两艘战舰之间至少有一个水平或垂直的空位分隔 (即没有相邻的战舰)。

示例 1:
image
输入:board = [["X",".",".","X"],[".",".",".","X"],[".",".",".","X"]]
输出:2

示例 2:
输入:board = [["."]]
输出:0

提示:
\(m == board.length\)
\(n == board[i].length\)
\(1 <= m, n <= 200\)
\(board[i][j] 是 '.' 或 'X'\)

class Solution {
public:
    int ans=0,n,m;
    int dx[4]={0,0,1,-1};
    int dy[4]={1,-1,0,0};
    void dfs(int x,int y,vector<vector<char>>& board){
        board[x][y]='.';
        for(int i=0;i<4;i++){
            int xx=x+dx[i];
            int yy=y+dy[i];
            if(xx>=0&&xx<n&&yy>=0&&yy<m&&board[xx][yy]=='X'){
                dfs(xx,yy,board);
            }
        }
    }
    int countBattleships(vector<vector<char>>& board){
        n=board.size(),m=board[0].size();
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(board[i][j]=='X'){
                    ans++;
                    dfs(i,j,board);
                }
            }
        }
        return ans;
    }
};
posted @ 2023-12-08 21:49  lipu123  阅读(20)  评论(0)    收藏  举报