在地图周围一圈增加一圈0作为外海, dfs遍历外海每一个方格, 若与外海方格相邻的岛屿未被遍历过,那么这就是一个新的岛屿, 再用一个dfs去遍历这个岛。
#include <cstring>
#include <iostream>
using namespace std;
const int N = 60;
int g[N][N], n, m, res;
bool st[N][N];
int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};
void dfs_1(int r, int c)
{
st[r][c] = true;
//四向连通
for (int i = 0; i < 4; i ++)
{
int x = dx[i] + r, y = dy[i] + c;
if (st[x][y] || g[x][y] == 0) continue;
dfs_1(x, y);
}
}
void dfs_0(int r, int c)
{
st[r][c] = true;
//八向连通
for (int i = -1; i <= 1; i ++)
for (int j = -1; j <= 1; j ++)
{
int x = r + i, y = c + j;
if (x < 0 || x > n + 1 || y < 0 || y > m + 1 || st[x][y]) continue;
if (g[x][y] == 0) dfs_0(x, y);
else dfs_1(x, y), res ++;
}
}
int main ()
{
int T;
cin >> T;
while (T --)
{
memset(g, 0, sizeof g);
memset(st, false, sizeof st);
cin >> n >> m;
res = 0;
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= m; j ++)
{
char c; cin >> c;
g[i][j] = c - '0';
}
dfs_0(0, 0); // 从一个外海方格开始dfs
cout << res << '\n';
}
return 0;
}
想要请教一个问题,在您的dfs_1函数中,并没有进行(x < 0 || x > n + 1 || y < 0 || y > m + 1)这样的判断。
正常来说传入的r,c在之前判断过了,可以不需要,可是r,c分别加了dx和dy,难道不会越界吗?这样是不是不太严谨?
g数组是全局变量,默认就是0,g[x][y]==0的话就被continue,而且他只遍历标记是1的点
在图的外界全都是海水
太妙了
请问为什么是8方向呢
海水之间是八联通,陆地之间是四联通,
真不错
优美,雅—code
代码简洁,不脱泥带水;注释清楚,不拐弯抹角——颇有y总风范
g[i][j] = c - ‘0’;
大佬,请问这句是什么意思?
为什么这个输入要这样
这才是dfs的最高境界,666
我是若只
妙啊
不错的思路!
厉害!~