[问题背景]
假设'#'是陆地,'.'是海洋。
我们从图中把左、上、右、下四个方向相邻的'#'连起来作为一个连通块,也就是一个“岛屿”,每个岛屿的面积就是'#'的个数。
如图:
图中有三个连通块,按自左向右再自上而下的顺序,三个连通块的面积依次是4、2、1.
输出这些连通块的面积。
[测试样例1]
##.#.
#..#.
#...#
[输出样例1]
4 2 1
[测试样例2]
##.#..
#..#..
#...#.
###...
#....#
[输出样例2]
8 2 1 1
[测试样例3]
###..#
#.#...
###...
......
###.##
#.#.#.
[输出样例3]
8 1 5 3
[思路分析]
以左边的连通块为例,应能实现这样的递归访问,每次递归时都将面积+1
我们对二维数组中的元素进行遍历循环,遇到#就开始深搜,搜完一整个连通块后返回整个大循环,继续遍历后面的元素。
[代码求解]
以下是针对测试样例3编写的代码。
#define N 6
#define M 6
#include <iostream>
#include <vector>
using namespace std;
void dfs(int, int); // 声明深搜dfs函数
// 在main()之外声明的都是全局变量,main()后面的函数也可以使用这些全局变量
char c[N][M]; // 记录#.图
vector<int>area; // 记录各个连通块的面积
int sum = 0; // 置面积初值为0
int vis[N][M] = {0}; //记录每个元素是否被访问过,初值0表示没有访问过
int main(){
//int N, M; //N行M列
//cin >> N >> M;
//因为传长度为变量的二维数组给函数的问题本人还没有解决,所以很抱歉只能用宏定义的方法做
//记录#.图