题目 3153: 蓝桥杯 2023 年第十四届省赛真题-岛屿个数【双DFS-50行代码】

题目 3153: 蓝桥杯 2023 年第十四届省赛真题-岛屿个数

提示:👆点击标题跳转原题👆

🤔思路

  • 对八个方向进行搜索,下一步(没有走过的)只有可能是海洋或者是陆地两种情况
  • 搜到陆地就将与它相邻的陆地全部走一遍 搜索八个方向,就可以进入上下没有相邻但是斜着相邻的岛屿内部进行搜索,如果遇到环形岛屿是搜索不进去的

👏对地图的处理

  • 将地图向外扩大一格
  • 并从坐上角进行搜索

⌨️代码

c 复制代码
#include <iostream>
#include <cstring>
using namespace std;
const int N = 60;
int g[N][N];
bool st[N][N];
int dx4[] = {0, 0, 1, -1}, dy4[] = {1, -1, 0, 0};								//四个方向的向量
int dx8[] = {-1, -1, -1, 0, 1, 1, 1, 0}, dy8[] = {-1, 0, 1, 1, 1, 0, -1, -1};	//八个方向的向量
int cnt, T, m, n;

inline void dfs1(int x, int y) {
	st[x][y] = true;
	for (int i = 0; i < 4; i++) {
		int nx = x + dx4[i], ny = y + dy4[i];
		//没有走过,符合陆地的范围并且是陆地
		if (!st[nx][ny] && x >= 1 && x <= m && y >= 1 && y <= n && g[nx][ny]) dfs1(nx, ny);
	}
}

inline void dfs2(int x, int y) {		//八方向搜索
	st[x][y] = true;
	for (int i = 0; i < 8; i++) {
		int nx = x + dx8[i], ny = y + dy8[i];
		//没有走过,符合海洋的范围
		if (!st[nx][ny] && nx >=0 && nx <= m+1 && ny >= 0 && ny <= n+1) {
			if (!g[nx][ny]) dfs2(nx, ny);		//下一步是海洋继续搜索
			else if (g[nx][ny]) {				//下一步是陆地就将相邻的所有陆地设置为走过的状态
				dfs1(nx, ny);
				cnt += 1;						//并且岛屿数量加一
			}
		}
	}
}

int main() {
	ios::sync_with_stdio(false);				//取消IO同步流
	cin.tie(0);									//解除cin&cout绑定
	cin >> T;
	while (T--) {
		cin >> m >> n;
		memset(g, 0, sizeof g);					//重新分配地图
		memset(st, false, sizeof st);			//重新分配地图状态
		cnt = 0;
		for (int i = 1; i <= m; i++) {
			for (int j = 1; j <= n; j++) {
				char x;cin >> x;
				g[i][j] = x - '0';
			}
		}
		dfs2(0, 0);
		cout << cnt << endl;
	}
}

🥰通过结果

相关推荐
零售ERP菜鸟6 小时前
范式革命:从“信息化”到“数字化”的本质跃迁
大数据·人工智能·职场和发展·创业创新·学习方法·业界资讯
网络安全-杰克9 小时前
2026面试自动化测试面试题【含答案】
自动化测试·软件测试·面试·职场和发展
努力学算法的蒟蒻10 小时前
day79(2.7)——leetcode面试经典150
算法·leetcode·职场和发展
CodeSheep程序羊10 小时前
拼多多春节加班工资曝光,没几个敢给这个数的。
java·c语言·开发语言·c++·python·程序人生·职场和发展
学历真的很重要11 小时前
【系统架构师】第二章 操作系统知识 - 第二部分:进程与线程(补充版)
学习·职场和发展·系统架构·系统架构师
hqyjzsb12 小时前
盲目用AI提效?当心陷入“工具奴”陷阱,效率不增反降
人工智能·学习·职场和发展·创业创新·学习方法·业界资讯·远程工作
仟濹12 小时前
算法打卡 day1 (2026-02-06 周四) | 算法: DFS | 1_卡码网98 可达路径 | 2_力扣797_所有可能的路径
算法·leetcode·深度优先
仟濹13 小时前
算法打卡day2 (2026-02-07 周五) | 算法: DFS | 3_卡码网99_计数孤岛_DFS
算法·深度优先
YuTaoShao13 小时前
【LeetCode 每日一题】1653. 使字符串平衡的最少删除次数——(解法一)前后缀分解
算法·leetcode·职场和发展
VT.馒头13 小时前
【力扣】2727. 判断对象是否为空
javascript·数据结构·算法·leetcode·职场和发展