UVa - 572 Oil Deposits ( DFS求连通块 )
UVa - 572 Oil Deposits ( DFS求连通块 )
水题
数据结构 : 深度优先搜索 DFS
题意
输入一个m行n列的字符矩阵,统计字符“@”组成多少个八连块。如果两个字符“@”所在的格子相邻(横、竖或者对角线方向),就说它们属于同一个八连块。
思路
每次 通过DFS找到第一个”@”, 在它的八个方向寻找”@”并递归实现DFS 每次找到”@”都将其改为”*”来表示这个位置已经被踩过(或者新建一个等大小的二维数组来记录该位置是否被踩过)
最终DFS次数为连通块的个数
AC代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
#define maxn 100+10
char oil[maxn][maxn];
int N,M ;
void DFS( int x , int y )
{
oil[x][y] = '*';
for( int dx = -1 ; dx <= 1 ; dx++ )
{
for( int dy = -1 ; dy <= 1 ; dy++ )
{
int nx = x + dx , ny = y + dy;
if( nx >= 0 && nx < N && ny >= 0 && ny < M && oil[nx][ny] == '@' )
DFS(nx,ny);
}
}
return ;
}
void solve()
{
int o = 0;
for( int i = 0 ; i < N ; i++ )
{
for( int j = 0 ; j < M ; j++ )
{
if( oil[i][j] == '@' )
{
DFS(i,j);
o++;
}
}
}
printf("%d\n",o);
}
int main()
{
while( scanf("%d%d",&N,&M) == 2 && N )
{
getchar();
for( int i = 0 ; i < N ; i++ )
{
for( int j = 0 ; j < M ; j++ )
scanf("%c",&oil[i][j]);
getchar();
}
// for( int i = 0 ; i < N ; i++ )
// {
// for( int j = 0 ; j < M ; j++ )
// printf("%c",oil[i][j]);
// printf("\n");
// }
solve();
}
return 0;
}