搜狗笔试:有两个数,A和B,六种操作分别是+12,-12,+7,-7,+5,-5。A经过若干次操作,变成B


描述 :有两个数,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);   
}

测试结果:

谢谢观看!微笑吐舌头大笑


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值