ZOJ1709/POJ1562 油田问题/搜索/DFS

Oil Deposits
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u


Description

GeoSurvComp地质调查公司负责探测地下石油储藏。 GeoSurvComp现在在一块矩形区域探测石油,并把这个大区域分成了很多小块。他们通过专业设备,来分析每个小块中是否蕴藏石油。如果这些蕴藏石油的小方格相邻,那么他们被认为是同一油藏的一部分。在这块矩形区域,可能有很多油藏。你的任务是确定有多少不同的油藏。


Input
输入可能有多个矩形区域(即可能有多组测试)。每个矩形区域的起始行包含m和n,表示行和列的数量,1<=n,m<=100,如果m =0表示输入的结束,接下来是n行,每行m个字符。每个字符对应一个小方格,并且要么是'*',代表没有油,要么是'@',表示有油。


Output
对于每一个矩形区域,输出油藏的数量。两个小方格是相邻的,当且仅当他们水平或者垂直或者对角线相邻(即8个方向)。


Sample Input

1 1
*
3 5
*@*@*
**@**
*@*@*
1 8
@@****@*
5 5 
****@
*@@*@
*@**@
@@@*@
@@**@
0 0 
 
Sample Output
0
1
2

2


#include
using namespace std;

char grid[101][101];	//油田矩阵
int n, m;		//行、列
int dir[8][2] = { {-1, -1}, {-1, 0}, {-1, 1}, {0, -1}, {0, 1}, {1, -1}, {1, 0}, {1, 1} };    //一个网格的8个方向


void dfs(int x, int y)                  //从(x,y)进行深度优先遍历
{
	int xx, yy;
	grid[x][y] = '*';		//将grid中访问过的方块设置成‘*’,防止重复访问
	for(int i = 0; i < 8; i++)
	{
		xx = x + dir[i][0];
		yy = y + dir[i][1];
		if(xx<0 || xx>=n || yy<0 || yy>=m) continue;	//越界终止本次循环
		if(grid[xx][yy] == '@') dfs(xx, yy);			//核心算法语句。如果方格还是‘@’,则继续搜索
	}
}

int main()
{
	int i, j;	//循环变量
	int cnt;	//油田数量计数
	while(scanf("%d%d", &n, &m)&&(n||m))
	{
		cnt = 0;
		for(i = 0; i < n; i++) scanf("%s", grid[i]);
		for(i = 0; i < n; i++)
			for(j = 0; j < m; j++)
				if(grid[i][j] == '@') { dfs(i, j); cnt++; }	//在(i,j)遍历,并且遍历了一个“油田”,计数器加1
		printf("%d\n", count);
	}
	return 0;
}


你可能感兴趣的:(搜索)