描述 :有两个数,A和B,六种操作分别是+12,-12,+7,-7,+5,-5。A经过若干次操作,变成B
例如 A=12,B=24 那么只需要一个12即可,输入A=B=1,需要12,-12.。。。
思想:用一个顺序非循环队列来处理此问题,这种队列的好处是虽然节点已经出列但数据依然保存在数组中,迷宫问题
也可以用这种方法解决,算法是广度优先搜索穷举。
实现代码:
#include <stdio.h>
#include <malloc.h>
#define MAX 10000 //尽量定义大点,因为队列是以平方形式增长
int d[] = { 12,-12,7,-7,5,-5 };
typedef struct node {
int dis; //从A到这个点所走的路程
int data; //当前节点的值
int pre; //当前节点的前一个节点在队列中的下标
}Qu[MAX];
Qu qu; //定义一个顺序非循环队列
int front = -1,rear = -1; //初始化队列
//该函数得到一个队列,该队列包含A到B的路径
void ly(int A, int B)
{
int i,k,find=0; //find=0表示没找到最短路径
rear++; //入队
qu[rear].dis = 0;
qu[rear].data = A;
qu[rear].pre = -1;
while ((front != rear)&&(find==0))
{
front++;
for (i=0;i<6;i++)
{
rear++;
qu[rear].data = d[i];
qu[rear].dis = qu[front].dis + d[i];
qu[rear].pre = front;
if (qu[rear].dis==B-A)
{ //找到,打印,然后深藏功与名。。。。。
find = 1;
while (qu[rear].pre!=-1) {
printf("%d\n", qu[rear].data);
rear = qu[rear].pre;
}
break;
}
}
}
}
int main()
{
int A, B, i;
scanf_s("%d %d", &A, &B);
ly(A, B);
}
测试结果:
谢谢观看!