2
//初识dfs实在困难,只好猛刷题了。。。
//这题的主要思路找到一个油地只好边从油地的位置开始搜索上下左右斜对角搜索,如果发现油地标记为1
#include <stdio.h>
#include <iostream>
#include <string.h>
using namespace std;
int n,m;
int vis[110][110];
char c[110][110];
void dfs(int x,int y)
{
    if(vis[x][y])return;  //已标记过
    if(x>=n||y>=m||x<0||y<0) return;  //边界条件
    if(c[x][y]=='@')  //傻傻的只知道写多个,不知道用循环。。。
    {
        vis[x][y]=1;  //找到邻近的油地
        dfs(x+1,y);
        dfs(x-1,y);
        dfs(x,y+1);
        dfs(x,y-1);
        dfs(x-1,y-1);
        dfs(x+1,y+1);
        dfs(x-1,y+1);
        dfs(x+1,y-1);
    }
}
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        if(n==0&&m==0)
            return 0;
        int cnt=0;
        for(int i=0;i<110;i++)
            for(int k=0;k<110;k++)
            {
                vis[i][k]=0;
                c[i][k]=0;
            }
        getchar();  // 有坑 多了一个空格
        for(int i=0;i<n;i++)
        {
            for(int k=0;k<m;k++)
            {
                cin >> c[i][k];
            }
        }
        for(int i=0;i<n;i++)
        {
            for(int k=0;k<m;k++)
            {
                if(c[i][k]=='@'&&!vis[i][k])  //未被标记过的
                {
                    cnt++;
                    dfs(i,k);
                }
            }
        }
        printf("%d\n",cnt);
    }
    return 0;
}版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/a73265/article/details/46835175