【代码随想录】【算法训练营】【第57天 1】 [卡码99]岛屿数量

前言

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

day 57,周三,再ding一下~

题目详情

[卡码99] 岛屿数量

题目描述

卡码99 岛屿数量
卡码99 岛屿数量
LeetCode类似题目200 岛屿数量

解题思路

前提:岛屿数量
思路:DFS 或 BFS
重点:DFS、BFS实现

代码实现

C语言
DFS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//DFS

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

void dfs(char** grid, int gridSize, int *gridColSize, int colIdx, int rawIdx, int *count)
{
    // 退出条件
    if (grid[colIdx][rawIdx] == '0') {
        return;
    }
    
    // 递归
    grid[colIdx][rawIdx] = '0';
    (*count)++;
    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, count);
    } 
    
    return ;
}

int numIslands(char** grid, int gridSize, int* gridColSize) {
    // 不额外使用visited数组标识已经被遍历过,访问过的结点grid标记为'0'
    int result = 0;

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

    return result;
}

int main()
{
    // 输入
    int col = 0;
    int raw = 0;
    scanf("%d %d\n", &col, &raw);
    int gridSize = col;
    int *gridColSize = (int *)malloc(sizeof(int) * col);
    memset(gridColSize, 0, sizeof(int) * col);
    char **grid = (char **)malloc(sizeof(char *) * col);
    memset(grid, 0, sizeof(char *) * col);
    for (int i = 0; i < col; i++) {
        grid[i] = (char *)malloc(sizeof(char) * raw);
        memset(grid[i], 0, sizeof(char) * raw);
        int count = 0;
        char ch = 0;
        while (((ch = getchar()) != '\n') && (count < raw)) {
            if (ch == ' ') {
                continue;
            }
            grid[i][count++] = ch;
        }
        gridColSize[i] = raw;
    }

    // 处理
    int ans = numIslands(grid, gridSize, gridColSize);
    
    // 输出
    printf("%d\n", ans);
    for (int i = 0; i < col; i++) {
        free(grid[i]);
        grid[i] = NULL;
    }
    free(grid);
    grid = NULL;
    free(gridColSize);
    gridColSize = NULL;
    
    return 0;
}
BFS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

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

//BFS
#define QUEUE_MAX_SIZE  10000
void bfs(char** grid, int gridSize, int *gridColSize, int colIdx, int rawIdx, int *result)
{
    // 退出条件
    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';
    (*result)++;
    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];
            // 判断是否越界
            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';
        } 
    }
    
    return ;
}

int numIslands(char** grid, int gridSize, int* gridColSize) {
    // 不额外使用visited数组标识已经被遍历过,访问过的结点grid标记为'0'
    int result = 0;

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

    return result;
}

int main()
{
    // 输入
    int col = 0;
    int raw = 0;
    scanf("%d %d\n", &col, &raw);
    int gridSize = col;
    int *gridColSize = (int *)malloc(sizeof(int) * col);
    memset(gridColSize, 0, sizeof(int) * col);
    char **grid = (char **)malloc(sizeof(char *) * col);
    memset(grid, 0, sizeof(char *) * col);
    for (int i = 0; i < col; i++) {
        grid[i] = (char *)malloc(sizeof(char) * raw);
        memset(grid[i], 0, sizeof(char) * raw);
        int count = 0;
        char ch = 0;
        while (((ch = getchar()) != '\n') && (count < raw)) {
            if (ch == ' ') {
                continue;
            }
            grid[i][count++] = ch;
        }
        gridColSize[i] = raw;
    }

    // 处理
    int ans = numIslands(grid, gridSize, gridColSize);
    
    // 输出
    printf("%d\n", ans);
    for (int i = 0; i < col; i++) {
        free(grid[i]);
        grid[i] = NULL;
    }
    free(grid);
    grid = NULL;
    free(gridColSize);
    gridColSize = NULL;
    
    return 0;
}
并查集

今日收获

  1. 图的搜索:深度优先搜索(DFS)、广度优先搜索(BFS)
  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值