AOJ0118 Property Distribution(DFS)

来源:互联网 发布:罗马全面战争火攻算法 编辑:程序博客网 时间:2024/06/02 20:06

题意:

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

输入:

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

输出:

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

分析:

从任意的‘@’或‘#’或‘*’开始,记录开始时的水果种类,不停地把邻接的部分用‘%’代替(代表已经访问过)。一次DFS后与初始的这个水果相邻接的所有相同的水果都被替换成‘%’。

代码:

#include<iostream>using namespace std;const int max_=100;//四个方向移动的向量 int x1[4]={-1,0,1,0}, y1[4]={0,1,0,-1};int H,W;char p[max_][max_];//果园 //c代表水果种类 void dfs(int x, int y, char c){//将现在所在位置替换为'%';p[x][y]='%';//循环遍历移动的4个方向 for(int i=0; i<4; i++){//向x方向移动x1[i],向y方向移动y1[i]; int nx=x+x1[i], ny=y+y1[i];//判断(nx,ny)是否在园子内,以及此处的水果种类是否与开始的水果种类相同 if(nx>=0 && nx<H && ny>=0 && ny<W && p[nx][ny]==c){dfs(nx,ny,c);}}}void solve(){int res=0;for(int i=0; i<H; i++){for(int j=0; j<W; j++){//如果此位置并未被访问 if(p[i][j]!='%'){dfs(i,j, p[i][j]);res++;}}}cout << res << endl;}int main(){while(scanf("%d%d",&H,&W) && H && W){for(int i=0; i<H; i++){scanf("%s",p[i]);}solve();}return 0;}