问题描述:
解题思路:
可以考虑使用dfs,先用dfs标记全部外海区域(岛屿规模n,m外围的一圈也标记上),再用dfs遍历全部的岛屿接着判断。判断:如果该岛屿的某个点的前一个位置是外海就代表没有被围起来,ans++。
注意点:1.因为输入方式没有带空格,所以输入时要限制位数--'%1d'。
2.每次循环都要memset(d, 0, sizeof(d));
AC代码:
#include<bits/stdc++.h>
int M, N, d[52][52];
int dx[] = {1, -1, 0, 0, 1, 1, -1, -1};
int dy[] = {0, 0, 1, -1, -1, 1, 1, -1};
void dfs_sea(int x, int y) // 标记外海,用2表示
{
d[x][y] = 2;
//八个方向
for(int i = 0; i < 8; i ++)
{
int nx = x + dx[i], ny = y + dy[i];
if((nx < 0 || ny < 0 || nx > M + 1 || ny > N + 1))continue;
if(d[nx][ny] == 0)dfs_sea(nx, ny);
}
}
void dfs_island(int x, int y) // 遍历全部岛屿,用3表示,同时也表示已被标记
{
d[x][y] = 3;//搜索过的岛屿不再搜索
for(int i = 0; i < 4; i ++)
{
int nx = x + dx[i], ny = y + dy[i];
if(nx < 1 || ny < 1 || nx > M || ny > N)continue;
if(d[nx][ny] == 1)
dfs_island(nx, ny);
}
}
int main()
{
// 请在此输入您的代码
int T;
scanf("%d", &T);
while (T--)
{
scanf("%d %d", &M, &N);
//填充海水(为了每次循环边角无法覆盖元素都要初始化为0)**
memset(d, 0, sizeof(d));
//输入图
for (int i = 1; i < M + 1; i++)
{
for (int j = 1; j < N + 1; j++)
{
scanf("%1d", &d[i][j]);
}
}
dfs_sea(0, 0); //找出所有外海
int count;//计算岛屿数量
count = 0;
for (int i = 0; i < M + 2; i++)
{
for (int j = 0; j < N + 2; j++)
{
if (d[i][j] == 1 && d[i - 1][j] == 2) // 只能从外海搜索岛屿,所以岛屿前一定是外海“2”
{
dfs_island(i, j);//搜索岛屿
count++;
}
}
}
printf("%d\n", count);
}
return 0;
}
知识点:dfs