Java技术实现:编写方法查找二维数组中的顺时针闭合方形斐波那契路径
在二维矩阵中查找顺时针闭合方形斐波那契路径的算法思路
首先,我们得把问题拆解成两个核心条件:顺时针闭合方形路径和路径元素构成斐波那契数列,然后一步步推导解决方案。
一、明确核心定义
1. 顺时针闭合方形路径
指路径沿着矩形的四条边顺时针遍历,最终回到起点。具体来说:
- 路径基于一个矩形(由左上角
(x1,y1)和右下角(x2,y2)确定,要求x2 > x1、y2 > y1,即至少2行2列)。 - 可以从矩形四条边上的任意点作为起点,顺时针遍历完整的边界元素(顶边→右边→底边→左边),最终回到起点。
2. 斐波那契序列要求
路径上的元素按遍历顺序排列后,满足:从第三个元素开始,每个元素等于前两个元素之和(即seq[i] = seq[i-1] + seq[i-2],i≥2),且序列长度至少为3。
二、算法步骤拆解
步骤1:枚举所有可能的矩形
遍历矩阵中所有合法的矩形组合:
- 遍历左上角坐标
(x1,y1),其中0 ≤ x1 < 行数,0 ≤ y1 < 列数。 - 遍历右下角坐标
(x2,y2),其中x1 < x2 < 行数,y1 < y2 < 列数(确保矩形至少2行2列,有完整的四条边)。
步骤2:生成矩形的顺时针路径序列
对于每个矩形,提取四条边的元素,并生成所有可能起始点的顺时针序列:
- 顶边:行
x1,列从y1到y2的元素列表。 - 右边:列
y2,行从x1+1到x2的元素列表。 - 底边:行
x2,列从y2-1到y1的元素列表(反向遍历)。 - 左边:列
y1,行从x2-1到x1+1的元素列表(反向遍历)。
然后,以四条边上的每个点为起点,拼接出完整的顺时针遍历序列:
- 比如顶边第
i个元素为起点:顶边[i:] + 右边 + 底边 + 左边 + 顶边[:i](绕矩形一圈回到起点)。 - 同理处理右边、底边、左边的每个起始点。
步骤3:检查序列是否为斐波那契数列
对每个生成的序列执行以下检查:
- 如果序列长度小于3,直接跳过(无法验证斐波那契规则)。
- 从第三个元素开始,依次验证当前元素是否等于前两个元素之和。
- 只要有一个序列满足条件,立即返回
true;遍历完所有可能后仍无符合条件的序列,返回false。
三、伪代码实现
def find_fibonacci_square(matrix): rows = len(matrix) if rows == 0: return False cols = len(matrix[0]) if cols == 0: return False # 枚举所有可能的矩形 for x1 in range(rows): for y1 in range(cols): for x2 in range(x1 + 1, rows): for y2 in range(y1 + 1, cols): # 提取四条边的元素 top = [matrix[x1][y] for y in range(y1, y2 + 1)] right = [matrix[x][y2] for x in range(x1 + 1, x2 + 1)] bottom = [matrix[x2][y] for y in range(y2 - 1, y1 - 1, -1)] left = [matrix[x][y1] for x in range(x2 - 1, x1, -1)] # 检查所有起始点的序列 # 顶边起始点 for i in range(len(top)): seq = top[i:] + right + bottom + left + top[:i] if is_fibonacci(seq): return True # 右边起始点 for i in range(len(right)): seq = right[i:] + bottom + left + top + right[:i] if is_fibonacci(seq): return True # 底边起始点 for i in range(len(bottom)): seq = bottom[i:] + left + top + right + bottom[:i] if is_fibonacci(seq): return True # 左边起始点 for i in range(len(left)): seq = left[i:] + top + right + bottom + left[:i] if is_fibonacci(seq): return True return False def is_fibonacci(seq): if len(seq) < 3: return False for i in range(2, len(seq)): if seq[i] != seq[i-1] + seq[i-2]: return False return True
四、优化建议
对于较大的矩阵,上述基础算法的时间复杂度较高(O(M³N³),M为行数,N为列数),可以做以下优化:
- 提前过滤短序列:如果矩形边界的总元素数小于3,直接跳过该矩形。
- 斐波那契特性剪枝:如果序列中出现当前元素小于前两个正数之和的情况,提前终止检查(除非包含0的特殊情况)。
- 预处理斐波那契三元组:先找出矩阵中所有满足
a + b = c的元素三元组,再查找这些三元组是否在顺时针路径中连续出现,减少不必要的序列遍历。
内容的提问来源于stack exchange,提问作者Alexander Pol
相关产品推荐
相关产品推荐

