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

来源:互联网 发布:馥绿德雅洗发水知乎 编辑:程序博客网 时间:2024/05/22 06:22
描述 :有两个数,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);   }

测试结果:

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


0 0
原创粉丝点击