hdu 1241 dfs

题意:给两个整数n、m,接下来输入m行n列的一张图,如果m==0停止输入,否则 1 <= m <= 100 and 1 <= n <= 100,八方向联通,求‘@’组成的不联通的块数。

样例:

这应该是学dfs的模版题,挑战程序设计竞赛上有类似的题目,这道题稍微有点不同的就是是八方向联通而已,算法的思想还是一模一样,找到一个‘@’,然后开始按八方向递归搜索,将搜到的‘@’都改为‘*’,直到最后所有的都变为了‘*’,搜索也就结束了。

#include<iostream>
#include<math.h>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<string>
#define ll long long
#define MAX_N 105

using namespace std;

int n,m;
char pi[MAX_N][MAX_N];
int dir[8][2] = {{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}};  //八方向
int ans;

bool judge(int x,int y)
{
    if(x<1 || x>m || y<1 || y>n)
        return false;
    return true;
}
void dfs(int x,int y)
{
    for(int i = 0; i < 8; i++)
    {
        int xx = x+dir[i][0];
        int yy = y+dir[i][1];
        if(judge(xx,yy) && pi[xx][yy]=='@')
        {
            pi[xx][yy] = '*';  //将搜到的‘@’改为‘*’
            dfs(xx,yy);
        }
    }
}
void solve()
{
    ans = 0;
    for(int i = 1; i <= m; i++)
    {
        for(int j = 1; j <= n; j++)
        {
            if(pi[i][j]=='@')
            {
                pi[i][j] = '*';
                dfs(i,j);
                ans++;
            }
        }
    }
}
int main()
{
    while(cin>>m>>n,m)
    {
        for(int i = 1; i <= m; i++)
        {
            for(int j = 1; j <= n; j++)
            {
                cin>>pi[i][j];
            }
        }
        solve();
        cout<<ans<<endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/Xycdada/p/8005345.html