采用c语言,输入两个整数n,m(0<n,m<100000)每一次,第一个整数可以执行乘2,减1,加1三种操作的任意一种,求n到m至少需要多少次这样的操作。
时间: 2023-05-15 18:05:05 浏览: 321
这是一个比较典型的图论问题,可以使用广度优先搜索(BFS)来解决。具体来说,我们可以将每个整数看作图中的一个节点,如果两个整数之间可以通过一次操作相互转换,那么它们之间就有一条边。然后,我们从起点n开始进行BFS,直到找到终点m为止,每次扩展一个节点时,我们将其相邻的节点加入队列中,并记录它们的距离(即操作次数)。最终,我们就可以得到n到m的最短操作次数。
以下是C语言的代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXN 100000
int n, m;
int dist[MAXN + 1]; // dist[i]表示从n到i的最短操作次数
int q[MAXN + 1], head, tail;
int bfs() {
head = tail = 0;
q[tail++] = n;
dist[n] = 0;
while (head < tail) {
int x = q[head++];
if (x == m) return dist[m];
if (x * 2 <= MAXN && dist[x * 2] == -1) {
dist[x * 2] = dist[x] + 1;
q[tail++] = x * 2;
}
if (x - 1 >= 0 && dist[x - 1] == -1) {
dist[x - 1] = dist[x] + 1;
q[tail++] = x - 1;
}
if (x + 1 <= MAXN && dist[x + 1] == -1) {
dist[x + 1] = dist[x] + 1;
q[tail++] = x + 1;
}
}
return -1; // 无法到达终点
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 0; i <= MAXN; i++) {
dist[i] = -1; // 初始化距离为-1
}
printf("%d\n", bfs());
return 0;
}
```
注意,为了避免数组越界,我们需要将整数的范围扩大到100000,而不是99999。另外,由于题目中没有要求输出具体的操作序列,因此我们只需要输出最短操作次数即可。
阅读全文