AOJ 0118: Property Disribution(dfs)

原题地址:点击打开链接

H * W的矩形果园里有苹果、梨、蜜柑三种果树, 相邻(上下左右)的同种果树属于同一个区域,给出果园的果树分布,求总共有多少个区域。 (原题的样图中苹果为リ,梨为カ,蜜柑为ミ, 图中共10个区域)

输入:

多组数据,每组数据第一行为两个整数HWH <= 100, W <= 100),H =0 W = 0代表输入结束。以下HW列表示果园的果树分布, 苹果是@,梨是#, 蜜柑是*

输出:

对于每组数据,输出其区域的个数。

 

分析:迷宫问题。对于每一个格子,可以用深度优先搜索把相同果树的格子遍历并标记。也就是说,每做一次DFS,消灭掉一个区域。只需要遍历果园,对每一个未被标记的格子做DFS,做DFS的次数就是果园的区域数。这里不需要另外用其他数组标记格子已访问,只需要将格子的元素改为一个不会出现的元素如1即可。

 

#include <stdio.h>
#define MAX_W 100
#define MAX_H 100

int w, h;
int dx[] = {1, -1, 0, 0}, dy[] = {0, 0, 1, -1};
char m[MAX_H][MAX_W + 1];

void dfs(int x, int y, int t)
{
	m[x][y] = 0;
	
	for(int i = 0; i < 4; i ++){
		int nx = x + dx[i], ny = y + dy[i];
		if(nx >= 0 && nx < h && ny >= 0 && ny < w && t == m[nx][ny])
			dfs(nx, ny, t);
	}
}

void solve()
{
	int flag = 0, ans = 0;
	for(int i = 0; i < h; i ++){
		for(int j = 0; j < w; j ++)
			if(0 != m[i][j]){
				dfs(i, j, m[i][j]);
				ans ++;
			}
	}
	printf("%d\n", ans);
}

int main()
{
	scanf("%d%d", &w, &h);
	for(int i = 0; i < h; i ++)
		scanf("%s", m[i]);
	if(w || h)
		solve();
	return 0;
}

 

思路:

对于每一个果树用dfs搜索附近相同的果树,并做上标记,则dfs的次数即是答案了

你可能感兴趣的:(算法,C语言,DFS)