Hdu_1241 Oil Deposits

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1241

/*
遍历所有点,找到未被标记的‘@’,num++,标记该节点,对该点进行dfs,
找到相邻的'@',标记该节点,再次进入dfs,
直到各个方向都不存在相邻未被标记的'@'后退出,继续进行遍历
*/

#include<iostream>
using namespace std;

int m,n;
char grid[101][101];
int visited[101][101];
int dir[8][2]={{1,0},{1,1},{1,-1},{-1,0},{0,1},{0,-1},{-1,-1},{-1,1}};
int num;                 //num为deposit的数量
int fr,fc;

void dfs(int r,int c){

    for(int i=0;i<8;i++)
    {
        fr=r+dir[i][0];
        fc=c+dir[i][1];
        if(fr>=m||fr<0)
            continue;
        if(fc>=n||fc<0)
            continue;
        if(grid[fr][fc]=='*')
            continue;
        if(visited[fr][fc])
            continue;
        visited[fr][fc]=1;
        dfs(fr,fc);
    }

}

int main (){

    while(cin>>m>>n)
    {
        if(!m)
            break;

        for(int i=0;i<m;i++)
            cin>>grid[i];

        num=0;
        memset(visited,0,sizeof(visited));

        for(int i=0;i<m;i++)
        {
            for(int j=0;grid[i][j]!='\0';j++)
            {
                if(grid[i][j]=='*')
                    continue;
                if(visited[i][j])
                    continue;
                num++;
                visited[i][j]=1;
                dfs(i,j);
            }
        }
        cout<<num<<endl;
    }
    return 0;
}

 

posted @ 2014-01-29 22:47  neverchanje  阅读(158)  评论(0)    收藏  举报