You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:检查序列是否为斐波那契数列

对每个生成的序列执行以下检查:

  1. 如果序列长度小于3,直接跳过(无法验证斐波那契规则)。
  2. 从第三个元素开始,依次验证当前元素是否等于前两个元素之和。
  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为列数),可以做以下优化:

  1. 提前过滤短序列:如果矩形边界的总元素数小于3,直接跳过该矩形。
  2. 斐波那契特性剪枝:如果序列中出现当前元素小于前两个正数之和的情况,提前终止检查(除非包含0的特殊情况)。
  3. 预处理斐波那契三元组:先找出矩阵中所有满足a + b = c的元素三元组,再查找这些三元组是否在顺时针路径中连续出现,减少不必要的序列遍历。

内容的提问来源于stack exchange,提问作者Alexander Pol

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 10:32:31