POJ1562Oil Deposits(DFS经典)+DFS模板解析

                                       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(子状态)  
               }  
                恢复全局变量//回溯部分  
            }  
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值