UVa - 572 Oil Deposits ( DFS求连通块 )

UVa - 572 Oil Deposits ( DFS求连通块 )

水题
数据结构 : 深度优先搜索 DFS

题意

输入一个m行n列的字符矩阵,统计字符“@”组成多少个八连块。如果两个字符“@”所在的格子相邻(横、竖或者对角线方向),就说它们属于同一个八连块。

[ UVa - 572 (VJ) ]

思路

每次 通过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;
}
posted @ 2017-12-08 20:36  JinxiSui  阅读(102)  评论(0编辑  收藏  举报