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)