Oil Deposits (DFS)

来源:互联网 发布:大专女生知乎 编辑:程序博客网 时间:2024/05/20 18:48
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的入门题,从(0,0)开始扫,遇到油地'@'进入dfs,在dfs中向八个方向搜索,若是油地将它置为'*'或用vis数组记录这里已经搜索过了,保证下次不再搜索到这里,将它附近所有的油地都搜索完,然后置为'.' 相当于采油完毕,然后return到main继续往后扫.cnt纪录进入dfs的次数也就是油田数目。


AC代码:

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<cmath>#include<cstdlib>#include<queue>#include<set>#include<map>#include<vector>#include<stack>using namespace std;#define ll long longstruct NODE{    int x,y;};int m,n;char oil[105][105];int dir[8][2]={{0,-1},{0,1},{-1,0},{1,0},{-1,-1},{1,-1},{-1,1},{1,1}};      //定义向周围八个方向搜索的数组              // 下    上     左     右    左下    右下   左上  右上void DFS(int i,int j){    NODE bgin;        //定义开始的油地(前一个油田)的位置    bgin.x=i;    bgin.y=j;    queue<NODE> q;     //入队    q.push(bgin);    while(!q.empty()){        bgin=q.front();        q.pop();          //清除队首的位置,因为已经保存到bgin里了,在后面会以它为中心向周围搜索        for(int i=0;i<8;i++){            NODE tmp;         //定义暂时想要搜索的点            tmp.x=bgin.x+dir[i][0];            tmp.y=bgin.y+dir[i][1];            if(tmp.x<0||tmp.y<0||tmp.x>=m||tmp.y>=n||oil[tmp.x][tmp.y]=='.') //若要搜索的点越界则是不合法的点 则continue                continue;            if(oil[tmp.x][tmp.y]=='@'){  //若是油田则入队,并将它置为‘*’                q.push(tmp);                oil[tmp.x][tmp.y]='*';            }        }    }    return ;}int main(){    while((scanf("%d%d",&m,&n)!=EOF)&&m&&n){        int cnt=0;        for(int i=0;i<m;i++)            scanf("%s",oil[i]);        for(int i=0;i<m;i++)            for(int j=0;j<n;j++)            if(oil[i][j]=='@'){  //当遇到油地时进入DFS                cnt++;        //油田数加一                DFS(i,j);            }        printf("%d\n",cnt);    }    return 0;}



原创粉丝点击