X图形

本文解析了一道蓝桥杯省模拟题,涉及递归算法。关键在于理解题意,通过中心点的X图形特征判断并使用递归实现计数。代码展示了如何通过二重循环遍历和递归检查每个可能的中心点。
摘要由CSDN通过智能技术生成

1.题目

这道题是蓝桥云课上面的一道题目,它是2022年蓝桥杯省模拟题,题目难度为简单。

考察的知识点为递归。

题目链接:X图形

2.思路

如何理解题意?

蓝桥杯的题目和Leetcode题目最大的不同点在于,蓝桥杯的题目大部分都是以实际问题出发的,因此对于蓝桥杯的题目,我们首先得弄懂题意,这点我们可以从两个地方进行理解:

  • 题目要求
  • 题目样例

这两个地方可以很好的帮助我们理解题目的意思,从而找到合适算法来解题,这题是让我们求图形中有X图案的图形有几个。例如,对于最小的X图形,它有以下的规律:

它中间的字母和左上、左下、右上、右下的字母都是一样的,之后的同理可得。

怎么递归?

有了前面的规律后,我们得找到递归的触发条件和终止条件。那么怎么触发递归函数呢?

很明显,这道题的核心点是每个X图形的中心点,因此我们可以二重循环遍历二维数组,将每个坐标都当做是X图形的中心点。

那终止条件呢?对于X图形,如果我中间的字母和左上、左下、右上、右下的字母都是一样的,那么我是可以在小X图形上+1的。终止条件就是不满足上面的那个条件,就返回0,举个栗子:

下面这个图形我们可以得知它有2个X图形,而对于最外层的X,它是基于里面的小X图形上+1的。

3.代码

# 输入行和列
row,col = tuple(map(int,input().split()))
# 输入矩阵字母
arr = [input() for r in range(row)]
# 保存最终结果
cnt = 0
# 递归函数
def check(r,c,n):
  # 如果左上、左下、右上、右下坐标没有超出边界
  if r-n >=0 and c-n>=0 and r+n<row and c+n<col:
    # 保存左上、左下、右上、右下、中心的坐标,n为X图形的半径
    narr = set([arr[r][c],arr[r-n][c-n],arr[r+n][c-n],arr[r-n][c+n],arr[r+n][c+n]])
  else:
    return 0
  # 如果5个坐标的字母都是一样的,去重后narr长度肯定为1
  if len(narr) == 1:
    # 递归 + 1,X半径+1
    return check(r,c,n+1) + 1
  else:
    return 0

# 循环判断每个中心点
for r in range(1,row-1):
  for c in range(1,col-1):
    # 加入到结果之中
    cnt += check(r,c,1)
print(cnt)

  • 14
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小人物₍˄·͈༝·͈˄*₎◞ ̑̑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值