[置顶]心碎的花心龟农场遭遇洪水,雇一程序员帮忙编写程序计算损失(算法)

勤劳的花心龟日复一日的经营着自己的农场,投注了自己毕生的心血。但是让他心碎的是最近暴雨连连,农场也受到波及,很多区域都被淹没了。

       已知农场可以用MXN的矩阵表示(1 <= N <= 100; 1 <= M <= 100),矩阵中的每个元素代表农场的每一小块土地,元素要么为‘W’(表示被水淹没),要么为'.'(表示没有被水淹没)。
       现在,我们可怜的花心龟看着自己苦心经营的农场变成这样,心都碎了,他只有一个想法,统计出自己的农场到底被多少片水域所淹没。
       一片水域是由连续的若干相邻的小块地组成的,并且小每块地周围的八小块地都可以看做是和它相邻的。要求给出花心龟农场的的现状,并计算有多少块水域。(感谢热情的网友提供的题目)

例如:

输入农场规格(N和M):

10  12

输入农场现状(用矩阵表示):


输出水域块数:

3


花心龟请来了一位帅气的程序员,这位程序员看了农场的状况之后,他认为要解决这个问题,首先要分以下几个步骤进行思考(算法思路):


步骤 一、用如下数据结构,以一维数组的形式保存农场状况
struct FarmData{
  char ch; 
  int fDetected;//是否已探测到水的标志
};
  FarmData *p=(FarmData *)calloc(N*M,sizeof(FarmData));
步骤 二、对整个一维数组进行遍历,每当遍历到一个元素数据为‘w’时且该元素的fDetected标志为0(说明未对该区域进行查明),做第三个步骤,直到遍历完每个元素为止。
步骤 三、当步骤二遍历到未查明的水时,将该元素入栈保存。接着每次取栈中元素,并将其fDetected标志为1, 然后对其周围八个位置进行查明,如果是水则入栈保存,如此直到栈中没有任何数据为止。
步骤四、计数,每次步骤二遍历到一个未查明的W时计数器就加1,回到步骤二(因为每次查明到未查明的元素W时,都会将其周围的W标记为已查明,所以计数器最终的结果就代表整个农场有多少块水域)


这位程序员经过几番思考之后,终于在电脑下打下了这一段程序(算法实现代码):



小结:分而治之。首先在遍历整个数组中,分为两个决策阶段,一就是遍历到未查明的水,便对其周围的水进行标记以及计数一块水域,二就是遍历到已标记查明的水或不是水,则进行下一次循环,最终遍历的结束就是问题的解决。

欢迎学习交流  转载不忘注明出处! ^_^

======= welcome to my HomePage(http://blog.csdn.net/zhanxinhang) to have a communication =======


posted on 2011-07-23 03:36  程序员新鲜事  阅读(320)  评论(0编辑  收藏  举报