题意理解
给定整数 nnn 和 xxx,每次操作可以选择 xxx 十进制表示中的某个非零数字 yyy,将 xxx 替换为 x×yx \times yx×y。求使 xxx 的十进制长度恰好变为 nnn 的最少操作次数。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
思路分析
BFS 求最短路
由于要求最少操作次数,这是一个典型的 BFS 问题。每个数值是一个状态,每次操作是一条边。
关键观察:
1. 乘以 000:结果变成 000,永远无法增长,无意义
2. 乘以 111:数值不变,无意义
3. 乘以 2∼92 \sim 92∼9:数值严格增大,长度不减
因此只需考虑乘以 ≥2\geq 2≥2 的数字。
无解情况:
如果 xxx 只包含数字 000 和 111,那么只能乘 111,数值永远不变,无法达到更大的长度。
算法流程:
1. 如果初始长度已达到 nnn,输出 000
2. 用队列进行 BFS,初始状态为 xxx
3. 每次取出当前数 curcurcur,枚举其所有 ≥2\geq 2≥2 的数字 ddd,计算 nxt=cur×dnxt = cur \times dnxt=cur×d
4. 若 nxtnxtnxt 长度达到 nnn,返回步数
5. 若 nxtnxtnxt 长度 <n< n<n 且未访问过,加入队列
6. 队列为空仍未达到,返回 −1-1−1
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
参考代码