问题描述 有一个 M*N 的蜂巢,用 M*N 大小的 char 二维数组(每行都是 N 列)表示。字符只能 是’C’(Clean,干净的蜂巢)或者’P’(Pollution, 污染的蜂巢),不存在其他字串输入。 如下图,沿着左上角第一个正六边形右下边拓展 N 列,正下边拓展 M 行,现在被油污 污染了一部分,求将被污染的部分切除后,剩余的干净部分被分割成了几片?问题描述 有一个 M*N 的蜂巢,用 M*N 大小的 char 二维数组(每行都是 N 列)表示。字符只能 是’C’(Clean,干净的蜂巢)或者’P’(Pollution, 污染的蜂巢),不存在其他字串输入。 如下图,沿着左上角第一个正六边形右下边拓展 N 列,正下边拓展 M 行,现在被油污 污染了一部分,求将被污染的部分切除后,剩余的干净部分被分割成了几片?
输入格式 M N 蜂巢第一行被污染的情况 … 蜂巢第 M 行被污染的情况 输出格式 整数(代表剩余的干净蜂巢有几片) 样例输入 2 3 P P C C P C 样例输出 2 样例说明 如上图蜂巢,有两行三列。 切割了被污染的蜂巢后,干净的蜂巢还有两片。 评测用例规模与约定 取值范围 0输入格式 M N 蜂巢第一行被污染的情况 … 蜂巢第 M 行被污染的情况 输出格式 整数(代表剩余的干净蜂巢有几片)
样例输入:
2
3
P P C
C P C
样例输出 2
样例说明 如上图蜂巢,有两行三列。 切割了被污染的蜂巢后,干净的蜂巢还有两片。 评测用例规模与约定 取值范围 0
源代码:
#include <stdio.h>
void pollute(char a[100][100], int m, int n, int i, int j)
{
if (a[i][j] == 'P')
{
return;
}
else
{
a[i][j] = 'P';
}
for (int k = -1; k <= 1; k++)
{
for (int l = -1; l <= 1; l++)
{
if ((i + k >= 0 && i + k < m) && (j + l >= 0 && j + l < n) && k * l != 1)
{
pollute(a, m, n, i+k, j+l);//不断递归
}
}
}
}
int main()
{
int m, n;
char a[100][100];
scanf("%d", &m);
scanf("%d", &n);
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
scanf(" %c", &a[i][j]);
}
}
int sum = 0; // 计算没被污染的片数
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
if (a[i][j] == 'C')
{
sum++;
pollute(a, m, n, i, j);
}
}
}
printf("%d", sum);
return 0;
}
思路:类似运用了深度优化搜索的方法,不断递归找到连在一起的蜂巢