zoukankan      html  css  js  c++  java
  • 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]!='';j++)
                {
                    if(grid[i][j]=='*')
                        continue;
                    if(visited[i][j])
                        continue;
                    num++;
                    visited[i][j]=1;
                    dfs(i,j);
                }
            }
            cout<<num<<endl;
        }
        return 0;
    }
  • 相关阅读:
    Outlook 邮件助手
    飞花令
    青蛙跳台阶
    如何提问,找到去说谎国的路
    如何计时一个小时十五分钟
    旋转数组的最小元素
    谁养鱼?
    小龙赚了多少?
    下一行是什么?
    5 = ?
  • 原文地址:https://www.cnblogs.com/neverchanje/p/3536387.html
Copyright © 2011-2022 走看看