Oil Deposits
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 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
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函数,然后把字符排列写在矩阵里面,然后判断直到出现的不是'@'为止。
下面的是AC代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
char map[101][101];//矩阵存储是'*'还是'@'.
int m,n,sum;//m是行数,n是列数
void dfs(int i,int j)//这一步实际上就是向8个方向搜索,递归函数
{
if(map[i][j]!='@'||i<0||j<0||i>=m||j>=n)//诺改点不可行或者越界的话,直接返回
{
return;
}
else//否则,该点标记为不可行,继续向其他八个方向进行深搜
{
map[i][j]='*';//标记为星号
dfs(i-1,j-1);
dfs(i-1,j);
dfs(i-1,j+1);
dfs(i,j-1);
dfs(i,j+1);
dfs(i+1,j-1);
dfs(i+1,j);
dfs(i+1,j+1);
}
}
int main()
{
int i,j;
while(~scanf("%d %d",&m,&n))
{
if(m==0||n==0)//输出0的话直接结束程序了
{
break;
}
sum=0;//sum就是用来记录结果的
for(i=0;i<m;i++)//先把图案的形状都输进来
{
for(j=0;j<n;j++)
{
cin>>map[i][j];
}
}
for(i=0;i<m;i++)//然后对是不是'@'进行判断,递归函数应用
{
for(j=0;j<n;j++)
{
if(map[i][j]=='@')
{
dfs(i,j);
sum++;
}
}
}
cout<<sum<<endl;
}
return 0;
}
DFS基本模板:
void dfs(int 当前状态)
{
if(当前状态为边界状态)
{
记录或输出
return;
}
for(i=0;i<n;i++) //横向遍历解答树所有子节点
{
//扩展出一个子状态。
修改了全局变量
if(子状态满足约束条件)
{
dfs(子状态)
}
恢复全局变量//回溯部分
}
}