C语言中的求图像周长问题(ZOJ 1047)

该博客介绍了如何使用C语言解决ZOJ 1047题,即在给定图形中求指定位置的图形周长。通过递归算法寻找图像并将其标记,然后根据相邻元素计算周长。周长计算与图像内标记点数量无关,取决于标记点的边界情况。
摘要由CSDN通过智能技术生成

描述:
给一个用 . 和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};//每组数据的结果
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值