The GeoSurvComp geologic survey company is for detecting underground oil deposits. GeoSurvComp works
with one large rectangular region of land at a time, creates a grid that divides the land into numerous square
plots. It then analyzes each plot separately, using equipment to determine whether or not the plot contains oil.
A plot containing oil is called a pocket. If two pockets adjacent, then they are part of the same oil deposit. Oil
deposits can be quite large and may contain numerous Your job is to determine how many different oil deposits
are contained in a grid.
input
The input file contains one or more grids. Each grid begins with a line containing m and n, the number of rows and
columns in the grid, separated by a single space. If m = 0 it signals the end of the input; otherwise 1 <= m <= 100
and 1 <= n <= 100.Following this are m lines of n characters each (not counting the end-of-line characters). Each
character corresponds to one plot, and is either `*', representing the absence of oil, or `@',representing an oil pocket.
Output
For each grid, output the number of distinct oil deposits. Two different pockets are part of the same oil deposit if theyare adjacent horizontally, vertically, or diagonally. An oil deposit will not contain more than 100 pockets.
1 1
*
3 5
* *@* *
*@*@*
1 8
@@****@*
* * * * @
* @ @ * @
* @ * * @
@@@ * @
@@ * * @
0 0
0
1
2
2
题意:题目的意思就是统计字符“@”组成了多少个八连块。如果两个字符“@”所在的格子相邻(横,竖或者对角线方向),就说他是同一个把连块。列如 输入的 5 5
有两个八连块,(注:从整体来看)。
通俗点讲就是:如果有单个的@的,则算是一个,但是对于@连着的,就只算是一个,问有多少个,就可以知道了,
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 100 + 5;
char pic[maxn][maxn];
int m, n, idx[maxn][maxn]; //该数组用来记路每一个点,防止重复
void dfs(int r, int c, int id)
{
if (r < 0 || r >= m || c < 0 || c >= n) return; //"出界"的格子
if (idx[r][c] > 0 || pic[r][c] != '@') return; //不是“@”或者已经访问过的格子
idx[r][c] = id; //(联通分量的编号),(编号防止同一格子被多次访问)
for (int dr = -1; dr <= 1; dr++) //搜素周围的八个方向,上下左右搜索
for (int dc = -1; dc <= 1; dc++)
if (dr != 0 || dc != 0) dfs(r + dr, c + dc, id);
}
int main()
{
while (scanf("%d %d", &m, &n)&& m&&n)
{
for (int i = 0; i<m; i++)
scanf("%s", pic[i]);
memset(idx, 0, sizeof(idx));
int cnt = 0;
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
if (idx[i][j] == 0 && pic[i][j] == '@') dfs(i, j, ++cnt);//满足条件就加一,然后继续遍历
printf("%d\n", cnt);
}
return 0;
}