用c语言写一个代码,利用分支限界的算法;题目:小王和小明站在一个操场上,小王起初所在的位置坐标为(X,Y),小明所在的位置坐标为(N,K),要求小王每次只能通过下面的方式移动到小明所在的位置: (1) 一次前后左右只能移动一个位置,到达(X+1,Y),(X-1,Y),(X,Y+1)或者(X,Y-1)的位置; (2) 一次移动到(2X,Y),(X,2Y)或者(2X,2Y)的位置。 问在小明不动的情况下,通过上面的移动方式,小王最少需要移动多少次才能到达小明所在的位置。 输入要求: 输入1行,包含四个整数,分别是X,Y,N,K,表示小王和小明所在的位置。 输出要求: 输出一个整数,占1行,表示小王移动的最少次数。 样例输入: 1 1 5 5 样例输出: 4
时间: 2023-10-09 22:11:13 浏览: 88
算法设计实验分支限界 C++实现
好的,这是一个比较经典的搜索题目,我会给您写一个C语言的分支限界算法的代码实现。
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXN 1005
#define INF 0x3f3f3f
struct node {
int x, y, step;
};
int x, y, n, k;
int vis[MAXN][MAXN];
int min(int a, int b) {
return a < b ? a : b;
}
int bfs() {
struct node queue[MAXN * MAXN];
int head = 0, tail = 0;
queue[tail].x = x;
queue[tail].y = y;
queue[tail].step = 0;
tail++;
while (head < tail) {
struct node t = queue[head++];
if (t.x < 0 || t.x > n || t.y < 0 || t.y > k) {
continue;
}
if (t.x == n && t.y == k) {
return t.step;
}
if (vis[t.x][t.y]) {
continue;
}
vis[t.x][t.y] = 1;
queue[tail++] = (struct node){t.x + 1, t.y, t.step + 1};
queue[tail++] = (struct node){t.x - 1, t.y, t.step + 1};
queue[tail++] = (struct node){t.x, t.y + 1, t.step + 1};
queue[tail++] = (struct node){t.x, t.y - 1, t.step + 1};
queue[tail++] = (struct node){t.x * 2, t.y, t.step + 1};
queue[tail++] = (struct node){t.x, t.y * 2, t.step + 1};
queue[tail++] = (struct node){t.x * 2, t.y * 2, t.step + 1};
}
return INF;
}
int main() {
scanf("%d%d%d%d", &x, &y, &n, &k);
printf("%d\n", bfs());
return 0;
}
```
分支限界算法的思路比较简单,用一个队列保存当前待扩展的节点,然后一个一个地扩展,扩展时将每个节点的下一步状态加入到队列中。由于这个题目中的状态数量比较多,所以需要使用一个判断数组来判断某个状态是否已经扩展过了。而在搜索过程中,每次我们只扩展出去一步,所以一旦扩展出去的点越界或者已经扩展过了,我们就可以直接跳过,不再继续扩展了。最后,如果我们找到了小明的位置,就返回到达该位置的步数,如果搜索完了整个空间,还没有找到小明的位置,就返回一个极大值INF。
阅读全文