代码随想录算法训练营第六十五天|KM99. 岛屿数量——深搜、KM99. 岛屿数量——广搜、KM100. 岛屿的最大面积

发布于:2024-06-24 ⋅ 阅读:(162) ⋅ 点赞:(0)

代码随想录算法训练营第六十五天

KM99. 岛屿数量——深搜

题目链接:KM99. 岛屿数量
使用递归深度搜索,将每次遇到的岛屿上下左右记录为已经到过,如果遇到没到过的说明它上下左右不是之间遍历过的岛屿,结果计数+1。最后统计计数即可知道有多少个岛屿

#include <iostream>
#include <vector>
using namespace std;

int dir[4][2] = {
        {0, 1}, //列+1,右移
        {1, 0}, //行+1,下移
        {-1, 0},//行-1,上移
        {0, -1} //列-1,左移
};
void dfs(const vector<vector<int>>& grid, vector<vector<bool>>& visited, int x, int y) {
    if (visited[x][y] || grid[x][y] == 0) return;
    visited[x][y] = true;
    for (int i = 0; i < 4; i++) {
        int next_x = x + dir[i][0];
        int next_y = y + dir[i][1];
        if (next_x < 0 || next_x >= grid.size() || next_y < 0 || next_y >= grid[0].size()) continue;// 越界了,直接跳过
        dfs(grid, visited, next_x, next_y);
    }
};

int main() {
    int N, M;
    std::cin >> N >> M;
    vector<vector<int>> grid(N, vector<int>(M, 0));
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            cin >> grid[i][j];
        }
    }
    vector<vector<bool>> visited(N, vector<bool>(M, false));
    int result = 0;
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            if (!visited[i][j] && grid[i][j] == 1) {
                result++;
                dfs(grid, visited, i, j);
            }
        }
    }
    std::cout << result << std::endl;

    return 0;
};

KM99. 岛屿数量——广搜

题目链接:KM99. 岛屿数量
使用广度搜索,将每次遇到的岛屿上下左右记录为已经到过,如果遇到没到过的说明它上下左右不是之间遍历过的岛屿,结果计数+1。最后统计计数即可知道有多少个岛屿


#include<iostream>
#include<vector>
#include<queue>

using namespace std;

int dir[4][2] = {
        {0,  1}, //列+1,右移
        {1,  0}, //行+1,下移
        {-1, 0},//行-1,上移
        {0,  -1} //列-1,左移
};

void bfs(vector<vector<int>> &grid, vector<vector<bool>> &visited, int x, int y) {
    queue<pair<int, int>> que;
    que.push({x, y});
    visited[x][y] = true;
    while (!que.empty()) {
        pair<int, int> cur = que.front();
        que.pop();
        for (int i = 0; i < 4; i++) {
            int next_x = cur.first + dir[i][0];
            int next_y = cur.second + dir[i][1];
            if (next_x < 0 || next_x >= grid.size() || next_y < 0 || next_y >= grid[0].size())continue;
            if (grid[next_x][next_y] == 1 && !visited[next_x][next_y]) {
                visited[next_x][next_y] = true;
                que.push({next_x, next_y});
            }
        }
    }
};

int main() {
    int N, M;
    std::cin >> N >> M;
    vector<vector<int>> grid(N, vector<int>(M, 0));
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            cin >> grid[i][j];
        }
    }
    vector<vector<bool>> visited(N, vector<bool>(M, false));
    int result = 0;
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            if (!visited[i][j] && grid[i][j] == 1) {
                result++;
                bfs(grid, visited, i, j);
            }
        }
    }
    std::cout << result << std::endl;
    return 0;
};

KM100. 岛屿的最大面积

题目链接:KM100. 岛屿的最大面积
在广度搜索中累计相邻陆地组成岛屿的面积,再在外部对比每块岛屿的面积取最大面积

#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>

using namespace std;
int max_count = 0;
int dir[4][2] = {
        {0,  1}, //列+1,右移
        {1,  0}, //行+1,下移
        {-1, 0},//行-1,上移
        {0,  -1} //列-1,左移
};

void bfs(vector<vector<int>> &grid, vector<vector<bool>> &visited, int x, int y,int& count) {
    queue<pair<int, int>> que;
    que.push({x, y});
    visited[x][y] = true;
    count++;
    while (!que.empty()) {
        pair<int, int> cur = que.front();
        que.pop();
        for (int i = 0; i < 4; i++) {
            int next_x = cur.first + dir[i][0];
            int next_y = cur.second + dir[i][1];
            if (next_x < 0 || next_x >= grid.size() || next_y < 0 || next_y >= grid[0].size())continue;
            if (grid[next_x][next_y] == 1 && !visited[next_x][next_y]) {
                visited[next_x][next_y] = true;
                que.push({next_x, next_y});
                count++;

            }
        }
    }
};

int main() {
    int N, M;
    std::cin >> N >> M;
    vector<vector<int>> grid(N, vector<int>(M, 0));
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            cin >> grid[i][j];
        }
    }
    vector<vector<bool>> visited(N, vector<bool>(M, false));
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            if (!visited[i][j] && grid[i][j] == 1) {
                int count = 0;
                bfs(grid, visited, i, j,count);
                max_count = max(max_count,count);
                
            }
        }
    }
    std::cout << max_count << std::endl;
    return 0;
};


网站公告

今日签到

点亮在社区的每一天
去签到