首页 > 试题广场 >

岛屿数量

[编程题]岛屿数量
  • 热度指数:120846 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给一个01矩阵,1代表是陆地,0代表海洋, 如果两个1相邻,那么这两个1属于同一个岛。我们只考虑上下左右为相邻。
岛屿: 相邻陆地可以组成一个岛屿(相邻:上下左右) 判断岛屿个数。
例如:
输入
[
[1,1,0,0,0],
[0,1,0,1,1],
[0,0,0,1,1],
[0,0,0,0,0],
[0,0,1,1,1]
]
对应的输出为3
(注:存储的01数据其实是字符'0','1')
示例1

输入

[[1,1,0,0,0],[0,1,0,1,1],[0,0,0,1,1],[0,0,0,0,0],[0,0,1,1,1]]

输出

3
示例2

输入

[[0]]

输出

0
示例3

输入

[[1,1],[1,1]]

输出

1

备注:
01矩阵范围<=200*200
void closeOneNode(char** grid, int gridRowLen, int gridColLen, int row, int col) {
    if(grid[row][col]=='0') 
        return;
    grid[row][col]='X';
    if(row<gridRowLen-1 && grid[row+1][col]=='1') 
        closeOneNode(grid, gridRowLen, gridColLen, row+1, col);  
    if(row>0 && grid[row-1][col]=='1') 
        closeOneNode(grid, gridRowLen, gridColLen, row-1, col); 
    if(col<gridColLen-1 && grid[row][col+1]=='1') 
        closeOneNode(grid, gridRowLen, gridColLen, row, col+1); 
    if(col>0 && grid[row][col-1]=='1') 
        closeOneNode(grid, gridRowLen, gridColLen, row, col-1); 
}
int solve(char** grid, int gridRowLen, int* gridColLen ) {
    int res=0;
    int i, j;

    for(i=0; i<gridRowLen; i++) {
        for(j=0; j<*gridColLen; j++) {
            if(grid[i][j]=='1') {
                closeOneNode(grid, gridRowLen, *gridColLen, i, j);
                res++;
            }
        }    
    }
    return res;
}

发表于 2024-03-23 13:00:56 回复(0)
int next[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
int vis[200][200];

int solve(char** grid, int gridRowLen, int* gridColLen ) {
    void dfs(int x, int y, int row, int col, char** grid);
    int ans = 0, m = 0, n = 0;
    int col = *gridColLen;
    //int vis[200][200];
    for (m = 0; m < gridRowLen; m++)
        for (n = 0; n < col; n++) {
            if (vis[m][n] == 0 && grid[m][n] == '1') {
                vis[m][n] = 1;
                dfs(m, n, gridRowLen, col, grid);
                ans++;
            }
        }
    return ans;
}

void dfs(int x, int y, int row, int col, char** grid) {
    int nx, ny;
    for (int i = 0; i < 4; i++) {
        nx = x + next[i][0];
        ny = y + next[i][1];
        if (nx < 0 || nx >= row || ny < 0 || ny >= col)
            continue;
        if (vis[nx][ny] == 0 && grid[nx][ny] == '1') {
            vis[nx][ny] = 1;
            dfs(nx, ny, row, col, grid);
        }
    }
}

发表于 2023-05-04 10:09:24 回复(0)
int count = 0;

void fill(char** grid, int gridRowLen, int gridColLen, int nowRow, int nowCol)
{
    grid[nowRow][nowCol] = '0';
    if (nowRow - 1 >= 0 && grid[nowRow - 1][nowCol] == '1') {
        fill(grid, gridRowLen, gridColLen, nowRow - 1, nowCol);
    }
    if (nowRow + 1 < gridRowLen && grid[nowRow + 1][nowCol] == '1') {
        fill(grid, gridRowLen, gridColLen, nowRow + 1, nowCol);
    }
    if (nowCol - 1 >= 0 && grid[nowRow][nowCol - 1] == '1') {
        fill(grid, gridRowLen, gridColLen, nowRow, nowCol - 1);
    }
    if (nowCol + 1 < gridColLen && grid[nowRow][nowCol + 1] == '1') {
        fill(grid, gridRowLen, gridColLen, nowRow, nowCol + 1);
    }
}

int solve(char** grid, int gridRowLen, int* gridColLen ) {
    // write code here
    int i, j;
    for (i = 0; i < gridRowLen; i++) {
        for (j = 0; j < gridColLen[i]; j++) {
            if (grid[i][j] == '1') {
                count++;
                fill(grid, gridRowLen, gridColLen[i], i, j);
            }
        }
    }
    return count;
}
发表于 2023-03-06 13:55:27 回复(0)