描述:
给一个用 . 和X表示的图形,图形在上、下、左、右、左上、左下、右上、右下8个方向都被看作是连通的,并且图像中间不会出现空洞,求这个图形的边长。
输入:
首先给出m、n、x、y四个正整数,下面给出m×n的图形,x、y表示点击的位置,全0表示结束。
输出:
点击的图形的周长。
输入样例:
2 2 2 2
XX
XX
6 4 2 3
.XXX
.XXX
.XXX
…X
..X.
X…
0 0 0 0
输出样例:
8
18
这道题主要可以分为两步来做,第一步是找出鼠标点击的那块图像,第二步是求出那块的图像的周长。
第一步的主要难点是如何找到那块图像。这里套用之前的回溯算法穷举显然是没有意义的。因为图像和周长都是确定的,我们并不需要讨论各种可能,而是要在已知一点的基础上查找它周围其他符合要求的点。所以基本的过程应该是,在鼠标点击的点周围找是X的点,然后再在刚刚找到的点周围找是X的点,以此类推,最终就可以找全那块图像中的所有点。这一过程用递归调用函数就可以实现。
为了区分鼠标点击的那块图像和其他图像,方便下面周长的计算,应该将这块图像内的所有点都标记为另一种符号,这样才算真正“找到”。
因为要检查的方向有8个,如果要用8个if语句一个一个检查实在太费劲了,所以可以把这8个方向中横、纵坐标的改变量分别、按顺序存到两个数组中,这样用一个for循环就可以实现8个方向的检查了。
第二步的周长计算有点难想。但后来我发现周长是多少和图像内有多少个标记点没有关系,而跟每个标记点上下左右是什么有关系。如果一个标记点上下左右存在一个’.‘或者不存在元素则周长+1。
#include<stdio.h>
char map[10][10]={
0};
int m,n;
int output[10]={
0};//每组数据的结果