题目 3153: 蓝桥杯 2023 年第十四届省赛真题-岛屿个数【双DFS-50行代码】
题目 3153: 蓝桥杯 2023 年第十四届省赛真题-岛屿个数
提示:👆点击标题跳转原题👆
🤔思路
- 对八个方向进行搜索,下一步(没有走过的)只有可能是海洋或者是陆地两种情况
- 搜到陆地就将与它相邻的陆地全部走一遍
搜索八个方向,就可以进入上下没有相邻但是斜着相邻的岛屿内部进行搜索,如果遇到环形岛屿是搜索不进去的
👏对地图的处理
- 将地图向外扩大一格
- 并从坐上角进行搜索
⌨️代码
#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; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」