【代码随想录】【算法训练营】【第57天 2】 [卡码100]岛屿的最大面积

前言

思路及算法思维,指路 代码随想录
题目来自 卡码网

day 57,周三,再ding一下~

题目详情

[卡码100] 岛屿的最大面积

题目描述

卡码100 岛屿的最大面积
卡码100 岛屿的最大面积
LeetCode类似题目695 岛屿的最大面积

解题思路

前提:岛屿最大面积
思路:DFS 或 BFS
重点:DFS、BFS实现

代码实现

C语言
DFS
// DFS

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

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

static void dfs(int** grid, int gridSize, int* gridColSize, int colIdx, int rawIdx, int *val)
{
    // 退出条件
    if (grid[colIdx][rawIdx] == 0) {
        return ;
    }

    // 递归
    grid[colIdx][rawIdx] = 0;
    (*val)++;
    for (int k = 0; k < 4; k++) {
        int nextCol = colIdx + dir[k][0];
        int nextRaw = rawIdx + dir[k][1];
        // 边界
        if ((nextCol < 0) || (nextCol >= gridSize) || (nextRaw < 0) || (nextRaw >= gridColSize[nextCol])) {
            continue;
        }
        dfs(grid, gridSize, gridColSize, nextCol, nextRaw, val);
    }

    return ;
}

int maxAreaOfIsland(int** grid, int gridSize, int* gridColSize) {
    int result = 0;

    for (int i = 0; i < gridSize; i++) {
        for (int j = 0; j < gridColSize[i]; j++) {
            int tmpVal = 0;
            dfs(grid, gridSize, gridColSize, i, j, &tmpVal);
            result = result > tmpVal ? result : tmpVal;
        }
    }

    return result;
}

int main()
{
    // 输入
    int n = 0;
    int m = 0;
    scanf("%d %d\n", &n, &m);
    int gridSize = n;
    int **grid = (int **)malloc(sizeof(int *) * gridSize);
    memset(grid, 0, sizeof(int *) * gridSize);
    int *gridColSize = (int *)malloc(sizeof(int) * gridSize);
    memset(gridColSize, 0, sizeof(int) * gridSize);
    for (int i = 0; i < gridSize; i++) {
        grid[i] = (int *)malloc(sizeof(int) * m);
        gridColSize[i] = m;
        int count = 0;
        char ch = 0;
        while (((ch = getchar()) != '\n') && (count < m)) {
            if (ch == ' ') {
                continue;
            }
            grid[i][count++] = ch - '0';
        }
    }
    
    //  dfs
    int ans = maxAreaOfIsland(grid, gridSize, gridColSize);
    
    // 输出
    printf("%d\n", ans);
    
    return 0;
}
BFS
// BFS

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define QUEUE_MAX_SIZE 2501

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

static void bfs(int** grid, int gridSize, int* gridColSize, int colIdx, int rawIdx, int *val)
{
    // 退出条件
    if (grid[colIdx][rawIdx] == 0) {
        return ;
    }

    // 队列
    int queue[QUEUE_MAX_SIZE][2];
    memset(queue, 0, sizeof(queue));
    int head = 0;
    int tail = 0;
    queue[tail][0] = colIdx;
    queue[tail][1] = rawIdx;
    tail++;
    grid[colIdx][rawIdx] = 0;
    (*val)++;
    while (head != tail) {
        int curCol = queue[head][0];
        int curRaw = queue[head][1];
        head++;
        for (int k = 0; k < 4; k++) {
            int nextCol = curCol + dir[k][0];
            int nextRaw = curRaw + dir[k][1];
            // 越界 or 水
            if ((nextCol < 0) || (nextCol >= gridSize) || (nextRaw < 0) || (nextRaw >= gridColSize[nextCol]) || (grid[nextCol][nextRaw] == 0)) {
                continue;
            }
            queue[tail][0] = nextCol;
            queue[tail][1] = nextRaw;
            tail++;
            grid[nextCol][nextRaw] = 0;
            (*val)++;
        }
    }

    return ;
}

int maxAreaOfIsland(int** grid, int gridSize, int* gridColSize) {
    int result = 0;

    for (int i = 0; i < gridSize; i++) {
        for (int j = 0; j < gridColSize[i]; j++) {
            int tmpVal = 0;
            bfs(grid, gridSize, gridColSize, i, j, &tmpVal);
            result = result > tmpVal ? result : tmpVal;
        }
    }

    return result;
}

int main()
{
    // 输入
    int n = 0;
    int m = 0;
    scanf("%d %d\n", &n, &m);
    int gridSize = n;
    int **grid = (int **)malloc(sizeof(int *) * gridSize);
    memset(grid, 0, sizeof(int *) * gridSize);
    int *gridColSize = (int *)malloc(sizeof(int) * gridSize);
    memset(gridColSize, 0, sizeof(int) * gridSize);
    for (int i = 0; i < gridSize; i++) {
        grid[i] = (int *)malloc(sizeof(int) * m);
        gridColSize[i] = m;
        int count = 0;
        char ch = 0;
        while (((ch = getchar()) != '\n') && (count < m)) {
            if (ch == ' ') {
                continue;
            }
            grid[i][count++] = ch - '0';
        }
    }
    
    //  dfs
    int ans = maxAreaOfIsland(grid, gridSize, gridColSize);
    
    // 输出
    printf("%d\n", ans);
    
    return 0;
}
并查集

今日收获

  1. 图的搜索:深度优先搜索(DFS)、广度优先搜索(BFS)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值