题目 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;
}
}

🥰通过结果

在这里插入图片描述

posted @ 2024-04-01 00:43  syn_tax  阅读(361)  评论(0)    收藏  举报  来源