
本文介绍如何用广度优先搜索(bfs)求解“将砖塔数组调整为非严格降序所需的最少单砖邻移次数”问题,给出可验证的python实现,并分析原始贪心思路的缺陷与bfs最优性的保证机制。
本文介绍如何用广度优先搜索(bfs)求解“将砖塔数组调整为非严格降序所需的最少单砖邻移次数”问题,给出可验证的python实现,并分析原始贪心思路的缺陷与bfs最优性的保证机制。
在砖塔重排问题中,给定一个长度为 $ n $ 的非负整数数组 towers,每个元素表示对应位置塔的砖块数。每次操作仅允许将1块砖从某一塔移动到其左侧或右侧相邻塔(即索引差为1),目标是使最终数组满足非严格降序:$ \text{towers}[0] \geq \text{towers}[1] \geq \cdots \geq \text{towers}[n-1] $。关键约束在于:每步仅移动1块砖、仅限相邻位置、移动成本统一为1——这使得总步数等于所有砖块位移距离之和(因每次移动距离恒为1),而最优解即最小化该总步数。
原始尝试的递归函数存在三个根本性缺陷:
- ❌ 方向受限:仅考虑从右向左“填补”(如 towers[i-1]
- ❌ 贪心过早:对每对逆序塔强行“拉平”,未考虑全局代价(例如连续多次小幅度调整可能劣于一次跨多塔的协同移动);
- ❌ 状态失控:无访问去重,易陷入循环或重复计算,且未建模状态空间图结构。
由于每步操作可逆、状态空间有限(砖总数 $ S = \sum \text{towers} $ 固定,所有合法状态对应 $ S $ 个不可区分球放入 $ n $ 个有标号盒子的方案数,即组合数 $ \binom{S+n-1}{n-1} $),且每步代价相同,广度优先搜索(BFS)天然保证首次抵达目标状态时的路径最短。我们以元组 tuple(towers) 作为哈希化状态,用队列维护 (moves_so_far, current_state),并使用集合 visited 避免重复扩展。
以下是完整、健壮的BFS实现:
def solved(towers):
"""判断是否已满足非严格降序"""
return all(t1 >= t2 for t1, t2 in zip(towers, towers[1:]))
def solve(towers):
if solved(towers):
return 0, towers.copy()
visited = {tuple(towers)}
from collections import deque
queue = deque([(0, towers.copy())])
n = len(towers)
while queue:
moves, curr = queue.popleft()
# 尝试所有相邻塔对 (i, i+1),双向移动
for i in range(n - 1):
# 方向:从 i→i+1(右移) 或 i+1→i(左移)
for src, dst in [(i, i + 1), (i + 1, i)]:
if curr[src] > 0: # 源塔有砖可移
next_state = curr.copy()
next_state[src] -= 1
next_state[dst] += 1
state_tuple = tuple(next_state)
if state_tuple not in visited:
visited.add(state_tuple)
if solved(next_state):
return moves + 1, next_state
queue.append((moves + 1, next_state))
# 理论上不会到达此处(解必存在)
raise RuntimeError("No solution found — unreachable state space")
使用示例:
print(solve([4, 3, 0, 1, 1])) # 输出: (1, [4, 2, 1, 1, 1]) print(solve([7, 0, 0, 0, 1])) # 输出: (3, [6, 1, 1, 0, 0])
✅ 正确性保障:BFS按步数分层遍历,首达即最优;
✅ 完备性保障:状态空间有限,visited 防止无限循环;
⚠️ 复杂度提示:最坏时间/空间复杂度为状态总数 $ O\left(\binom{S+n-1}{n-1}\right) $,适用于 $ S $ 和 $ n $ 较小(如 ≤10)的实例;大规模问题需转向动态规划或贪心启发式(如基于“累积偏差”的数学建模),但将不再保证最优。
进阶建议:若需调试搜索过程,可注入日志逻辑(如用 LoudList 替代 deque),观察状态扩展顺序,直观理解BFS如何逐层逼近最优解。记住:算法设计不仅是找答案,更是理解问题结构——本题的本质,是定义在整数格点上的最短路径搜索,而BFS正是其最自然的解法。










