算法训练营day51(12.19)

题目1: 99. 岛屿数量
代码:

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

static int dir[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};

void dfs(vector<vector<int>>& graph, vector<vector<bool>>& visited, int x, int y) {
    for(int i = 0; i < 4; i++) {
        int nx = dir[i][0] + x;
        int ny = dir[i][1] + y;
        if(nx < 0 || nx >= graph.size() || ny < 0 || ny >= graph[0].size()) continue;
        if(!visited[nx][ny] && graph[nx][ny] == 1) {
            visited[nx][ny] = true;
            dfs(graph, visited, nx, ny);
        }
    }
}
int main(void) {
    int m, n;
    cin >> m >> n;
    
    vector<vector<int>> graph(m, vector<int>(n));
    for(int i = 0; i < m; i++) {
        for(int j = 0; j < n; j++) {
            cin >> graph[i][j];
        }
    }
    
    vector<vector<bool>> visited(m, vector<bool>(n));
    int result = 0;
    for(int i = 0; i < m; i++) {
        for(int j = 0; j < n; j++) {
            if(!visited[i][j] && graph[i][j] == 1) {
                visited[i][j] = true;
                result++;
                dfs(graph, visited, i, j);
            }
        }
    }
    cout << result << endl;
    
}

题目2:99. 岛屿数量
代码:

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

static int dir[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};

void bfs(vector<vector<int>>& graph, vector<vector<bool>>& visited, int x, int y) {
    queue<pair<int, int>> que;
    que.push({x, y});
    visited[x][y] = true;
    while(!que.empty()) {
        auto top = que.front(); 
        que.pop();
        int cx = top.first;
        int cy = top.second;
        for(int i = 0; i < 4; i++) {
            int nx = cx + dir[i][0];
            int ny = cy + dir[i][1];
            if(nx < 0 || nx >= graph.size() || ny < 0 || ny >= graph[0].size()) continue;
            if(!visited[nx][ny] && graph[nx][ny] == 1) {
                que.push({nx, ny});
                bfs(graph, visited, nx, ny);
            }
        }
    }
}
int main(void) {
    int m, n;
    cin >> m >> n;
    
    vector<vector<int>> graph(m, vector<int>(n));
    for(int i = 0; i < m; i++) {
        for(int j = 0; j < n; j++) {
            cin >> graph[i][j];
        }
    }
    
    vector<vector<bool>> visited(m, vector<bool>(n));
    int result = 0;
    for(int i = 0; i < m; i++) {
        for(int j = 0; j < n; j++) {
            if(!visited[i][j] && graph[i][j] == 1) {
                visited[i][j] = true;
                result++;
                bfs(graph, visited, i, j);
            }
        }
    }
    cout << result << endl;
    
}

题目3: 100. 岛屿的最大面积
代码:

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

static int dir[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
int count = 0;
void dfs(vector<vector<int>>& graph, vector<vector<bool>>& visited, int x, int y) {
    for(int i = 0; i < 4; i++) {
        int nx = dir[i][0] + x;
        int ny = dir[i][1] + y;
        if(nx < 0 || nx >= graph.size() || ny < 0 || ny >= graph[0].size()) continue;
        if(!visited[nx][ny] && graph[nx][ny] == 1) {
            ++count;
            visited[nx][ny] = true;
            dfs(graph, visited, nx, ny);
        }
    }
}
int main(void) {
    int m, n;
    cin >> m >> n;
    
    vector<vector<int>> graph(m, vector<int>(n));
    for(int i = 0; i < m; i++) {
        for(int j = 0; j < n; j++) {
            cin >> graph[i][j];
        }
    }
    
    vector<vector<bool>> visited(m, vector<bool>(n));
    int result = 0;
    for(int i = 0; i < m; i++) {
        for(int j = 0; j < n; j++) {
            if(!visited[i][j] && graph[i][j] == 1) {
                count = 1;
                visited[i][j] = true;
                dfs(graph, visited, i, j);
                result = max(result, count);
            }
        }
    }
    cout << result << endl;
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容