时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 256M,其他语言512M
都来看题解了,不来我博客看看嘛? 链接:连通块
题目描述
给一个01矩阵,1代表是陆地,0代表海洋, 如果两个1相邻,那么这两个1属于同一个岛。我们只考虑上下左右为相邻。
岛屿: 相邻陆地可以组成一个岛屿(相邻:上下左右) 判断岛屿个数。
输入描述:
第一行输入两个数字n,m(1<=n<=200,1<=m<=200)
后面n行01序列,每一行m个字符,表示陆地和海洋
输出描述:
输出一个数字表示岛屿的个数
示例1
输入
5 5 11000 01011 00011 00000 00111
输出
3
解题思路
- 这里我提供的AC代码不是最优的,不算很简洁,因为这是基于我上一篇文章“统计岛屿个数”题目改编的代码。
- 我用到的算法是DFS。
- 了解有关DFS的内容:深度优先搜索解决连通块/染色问题——求岛的个数
- 这题不同的是,输入数据的时候没有空格,虽然可以存成
char[]字符串形式,但是我用了另一种较为复杂的方法实现。(就是懒得改了。)
题解
#include<stdio.h>
struct note
{
int x;
int y;
};
struct note que[400];
int head, tail;
int a[2000][2000];//地图
int book[2000][2000];
int next[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
int max = 0;
int sum = 0;
int n, m, startx, starty;
void dfs(int x, int y, int color)
{
int k;
int tx, ty;
a[x][y] = color; // 对本格子染色
for (k = 0; k < 4; k++)
{
tx = x + next[k][0];
ty = y + next[k][1];
if (tx < 1 || tx > n || ty < 1 || ty > m)
continue;
if (a[tx][ty] > 0 && book[tx][ty] == 0)
{
book[tx][ty] = 1;
dfs(tx, ty, color);
}
}
return;
}
int main()
{
int i, j;
int num = 0;
char c;
scanf("%d %d", &n, &m);
getchar();
for (i = 1; i <= n; i++)
{
for (j = 1; j <= m; j++)
{
c = getchar();
a[i][j] = c - '0';
}
getchar();
}
for (i = 1; i <= n; i++)
{
for (j = 1; j <= m; j++)
{
if (a[i][j] > 0)
{
num--;// num表示色号,并且是负数
book[i][j] = 1;
dfs(i, j, num);
}
}
}
printf("%d", -num);
return 0;
} 
京公网安备 11010502036488号