会员专享
请先
登录,登录后可使用今日免费解锁;
开通会员,或
购买
该题目所属题库
,可解锁完整内容。
解题思路
网格没有障碍,两点之间最短路就是曼哈顿距离。把所有非 0 格子记下来,从中心出发把它们都走到,最后再走回中心,求总步数最小值。
- 扫一遍格子,把非 0 的坐标放进 points,共 k 个点。起点是中心 (sx,sy)=(⌊n/2⌋,⌊m/2⌋)。
- 用 DFS 枚举访问顺序:当前在 (x,y),已经走过的距离是 step,用集合 vis 记下已经访问过的必访点。
- 若 vis 里已经有 k 个点,说明必访点都走完了,再补上走回中心的曼哈顿距离,用它更新答案 ans。
- 若当前 step 已经不小于目前的 ans,这条路不可能更优,直接返回。
- 否则枚举还没访问的点 p,走进去并累加曼哈顿距离,递归结束后再从 vis 里拿掉(回溯)。
题目内容
给定 n 行 m 列的格子,从中心出发,访问所有非 0 格子至少一次后再回到中心,求最少步数。每次可向上下左右走一格,计为一步。中心为第 ⌊n/2⌋ 行、第 ⌊m/2⌋ 列(行列下标从 0 开始)。
输入描述
第一行两个奇数 n 和 m。
接下来 n 行,每行 m 个整数,表示格子上的值。
输出描述
输出一个整数,表示最少步数。
数据范围
- 1≤n,m≤21,且 n、m 均为奇数
- 格子值为 0 或 1
- 非 0 格子个数不超过 15
样例1
输入:
3 3
1 0 0
0 1 0
1 0 0
输出:
6
说明:中心为 (1,1)。一条最优路线为中心 →(0,0)→(2,0)→ 中心,曼哈顿距离分别为 2、2、2,总步数 6。