前言
day 57,周三,再ding一下~
题目详情
[卡码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;
}
并查集
今日收获
- 图的搜索:深度优先搜索(DFS)、广度优先搜索(BFS)