HDU--1241:Oil Deposits (DFS)

1. 题目源地址:http://acm.hdu.edu.cn/showproblem.php?pid=1241

2. 题目大意:给出一块方格,若方格为@代表有油田,若为*代表没有油田。若某一格油田的水平、垂直、对角线相邻处也有油田,则他们同属于一块油田。输出油田块的个数。

3. 源代码:

#include<iostream>
#include<memory.h>
#include<stdio.h>
using namespace std;

char map[110][110];
int visited[110][110];
int M,N,sum;

int DFS(int x,int y)
{
    int i,j;
    
    if(visited[x][y])//如果八个方向全部都已经访问过,则结束搜索 
       return 0;
    
    else
    {
       visited[x][y]=1;
       if(map[x][y]=='@')
       {
          //分别对八个方向进行深度搜索 
          DFS(x-1,y);
          DFS(x-1,y+1);
          DFS(x,y+1);
          DFS(x+1,y+1);
          DFS(x+1,y);
          DFS(x+1,y-1);
          DFS(x,y-1);
          DFS(x-1,y-1);
       }   
    }
    
}

int main()
{
    int i,j;
    while(cin>>M>>N && (M||N))
    {
       getchar();
       memset(visited,0,sizeof(visited));
       
       //由于此题DFS的方向有八个,分别判断边界条件太麻烦,故可以将油田扩展为(M+2)*(N+2),将外围一圈的visited设为1方便判断 
       for(i=0;i<=M+1;i++)
       {
          visited[i][0]=1;
          visited[i][N+1]=1;
       }
       
       for(i=0;i<=N+1;i++)
       {
          visited[0][i]=1;
          visited[M+1][i]=1;
       }
       
       //输入map数组 
       for(i=1;i<=M;i++)
          for(j=1;j<=N;j++)
             cin>>map[i][j];
       
       //通过sum记录进行DFS的次数得到oil deposit的个数 
       sum=0;
       for(i=1;i<=M;i++)
          for(j=1;j<=N;j++)
          {
             if(!visited[i][j] && map[i][j]=='@')
             {
                sum++;
                DFS(i,j);
             }
          }       
       cout<<sum<<endl;
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值