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;
}
“`