代码随想录第51天

99.岛屿数量 深搜

python 复制代码
import java.util.*;

class Main{
    static int[][] directions = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
    static boolean[][] visited;
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        
        int[][] grids = new int[n][m];
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < m; j++) {
                grids[i][j] = sc.nextInt();
            }
        }
        
        int cnt = 0;
        visited = new boolean[n][m];
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < m; j++) {
                if(grids[i][j] == 1 && !visited[i][j]) {
                    cnt++;
                    dfs(grids, i, j);
                }
            }
        }
        System.out.println(cnt);
    }
    
    private static void dfs(int[][] grids, int x, int y) {
        visited[x][y] = true;
        for(int i = 0; i < 4; i++) {
            int nextX = x + directions[i][0];
            int nextY = y + directions[i][1];
            if(check(grids, nextX, nextY)) {
                dfs(grids, nextX, nextY);
            }
        }
    }
    
    private static boolean check(int[][] grids, int x, int y) {
        int n = grids.length;
        int m = grids[0].length;
        return x >= 0 && x < n && y >= 0 && y < m && !visited[x][y] && grids[x][y] == 1;
    }
}

99.岛屿数量 广搜

python 复制代码
import java.util.*;

// dfs
class Main {
    public static void main (String[] args) {
        Main main = new Main();
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        int[][] island = new int[n][m];
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < m; ++j) {
                island[i][j] = sc.nextInt();
            }
        }
        int result = main.getIslandNum(island);
        System.out.println(result);
    }
    
    public int getIslandNum(int[][] island) {
        int numsIsland = 0;
        int row = island.length;
        int col = island[0].length;
        for (int i = 0; i < row; ++i) {
            for (int j = 0; j < col; ++j) {
                if (island[i][j] == 1) {
                    ++numsIsland;
                    dfs(island, i, j);
                }
            }
        }
        return numsIsland;
    }
    
    public void dfs(int[][] island, int x, int y) {
        int row = island.length;
        int col = island[0].length;
        if (x < 0 || y < 0 || x >= row || y >= col || island[x][y] == 0) {
            return;
        }
        island[x][y] = 0; // 标记为已经访问
        
        dfs(island, x, y + 1);
        dfs(island, x, y - 1);
        dfs(island, x + 1, y);
        dfs(island, x - 1, y);
    }
}

100.岛屿的最大面积

python 复制代码
#include <stdio.h>
#include <stdlib.h>

// 四方向向量 下 右 上 左(逆时针)
int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, 1, 0, -1};

int bfs(int **G, int N, int M, int x, int y);

int main(void) {
    int N, M;
    scanf("%d %d", &N, &M);
    
    // 创建N行M列矩阵
    int **G = (int **)calloc(N, sizeof(int *));
    for(int i = 0; i < N; ++ i) {
        G[i] = (int *)calloc(M, sizeof(int));
        for(int j = 0; j < M; ++ j) {
            scanf("%d", &G[i][j]);
        }
    }
    
    // DFS函数
    int max = 0;
    int curMax;
    for(int i = 0; i < N; ++ i) {
        for(int j = 0; j < M; ++ j) {
            if (G[i][j]) {
                G[i][j] = 0;
                curMax = bfs(G, N, M, i, j);
                max = max < curMax ? curMax : max;
            }
        }
    }
    printf("%d\n", max);
    
    // 释放内存
    for(int i = 0; i < N; ++ i) free(G[i]);
    free(G);
    return 0;
}

int bfs(int **G, int N, int M, int x, int y) {
    int queue[500][2];
    int front = 0, rear = 0;
    queue[rear][0] = x;
    queue[rear ++][1] = y;
    
    int curx, cury;
    int res = 1;
    while(front < rear) {
        curx = queue[front][0];
        cury = queue[front ++][1];
        for(int i = 0; i < 4; ++ i) {
            int nextx = curx + dx[i];
            int nexty = cury + dy[i];
            if (nextx >= 0 && nextx < N && nexty >= 0 && nexty < M) {
                if (G[nextx][nexty]) {
                    G[nextx][nexty] = 0;
                    ++ res;
                    queue[rear][0] = nextx;
                    queue[rear ++][1] = nexty;
                }
            }
        }
    }
    return res;
}
相关推荐
csdn_aspnet9 分钟前
C++ 3个有序点的方向(Orientation of 3 ordered points)
c++·算法
赤生云电竞32 分钟前
GPU算力共享平台架构实践:任务分发与资源隔离的关键配置
算法·架构·gpu算力
青少儿编程课堂2 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:折半搜索优化子集枚举(Meet in the Middle)解析
c++·python·算法·bfs·信息学竞赛
Oneshot4 小时前
DLX(Dancing Links)算法详解:求解数独最快的算法
算法
青少儿编程课堂5 小时前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会Scratch考级:校园连连看解析
c++·python·算法·bfs·信息学竞赛
kongdong5 小时前
Hikyuu | RSI均值回归交易策略实现
算法·均值算法·回归·量化交易·交易策略·hikyuu
小王C语言5 小时前
优选算法:分治-归并排序
算法
非优秀程序员16 小时前
第05章 播放器大战,暴风、快播与那一夜|《互联网产品恩仇录》
算法
武子康1 天前
驾驶轨迹换个坐标,就能给移动机器人用吗?
人工智能·算法·机器学习