Hdu 1241 Oil Deposits DFS算法

Oil Deposits

Problem Description
The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. GeoSurvComp works with one large rectangular region of land at a time, and creates a grid that divides the land into numerous square plots. It then analyzes each plot separately, using sensing equipment to determine whether or not the plot contains oil. A plot containing oil is called a pocket. If two pockets are adjacent, then they are part of the same oil deposit. Oil deposits can be quite large and may contain numerous pockets. Your job is to determine how many different oil deposits are contained in a grid.

Input
The input file contains one or more grids. Each grid begins with a line containing m and n, the number of rows and columns in the grid, separated by a single space. If m = 0 it signals the end of the input; otherwise 1 <= m <= 100 and 1 <= n <= 100. Following this are m lines of n characters each (not counting the end-of-line characters). Each character corresponds to one plot, and is either *', representing the absence of oil, or@’, representing an oil pocket.

Output
For each grid, output the number of distinct oil deposits. Two different pockets are part of the same oil deposit if they are adjacent horizontally, vertically, or diagonally. An oil deposit will not contain more than 100 pockets.

Sample Input
1 1
*
3 5
@@*
@
@@*
1 8
@@**@*
5 5
**@
@@@
@*@
@@@*@
@@**@
0 0

Sample Output
0
1
2
2

题意理解: 在给出的一个矩阵中找出油田的个数,其中相邻的两块油田视为一块油田;
所用到的知识点: DFS搜索算法

DFS:即深度优先算法

 在一个元素的周围找到符合要求的元素,然后再以这个元素为起点再搜索符合要求的搜素,因为是优先寻找下一个符合的元素,所以叫深度优先算法。

DFS核心算法代码

void dfs(int x,int y)      // 需要开始查找的第一个位置
{
    visit[x][y]=1;
    int newx,newy;    //  记录相邻的符合要求的位置坐标
    for(i=0;i<8;i++)   //  八个方向 
    {
        newx=x+dir[i][0];
        newy=y+dir[i][1];
        if(newx>=0&&newy<n&&newy>=0&&newy<m&&!visit[newx][newy]&&a[newx][newy]='@')
        dfs(newx,newy);    //  一旦符合要就在另开一个函数进行下一个符合
    }                                  //要求的元素的寻找,并且该层的状态还在保持, 
}                          //  内层函数运行完以后还能接着刚才的状态继续运行

本题代码

#include<stdio.h>
#include<queue>
#include<cstring>
using namespace std;
char a[110][110];
int visit[110][110];
int n,m;
int dir[8][2]={{0,-1},{0,1},{-1,0},{1,0},{-1,-1},{1,-1},{-1,1},{1,1}};
void dfs(int x,int y)      //  递归的妙用  
{
    int newx,newy;
    visit[x][y]=1;        
        for(int i=0;i<8;i++)
        {
            newx=x+dir[i][0];
            newy=y+dir[i][1];
            if(newx>=0&&newx<n&&newy>=0&&newy<n&&!visit[newx][newy]&&a[newx][newy]=='@')
            dfs(newx,newy);     // 这一步递归调用但是这一层的i值还是保存在这一层的,每一层都结束都可以回来接着继续 
        }
}
int main()
{
    int i,j,num;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        num=0;
        for(i=0;i<n;i++)
        scanf("%s",a[i]);
         memset(visit,0,sizeof(visit));  // 初始化置零,防止出错; 
        for(i=0;i<n;i++)
        for(j=0;j<n;j++)
        if(!visit[i][j]&&a[i][j]=='@')
        num++,dfs(i,j);  // 每遇到一个油田都先加一,然后用dfs对和这个位置相连通的油田进行标记 
        printf("%d\n",num);
    }
    return 0;
 } 

“`

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值