搜狗笔试:有两个数,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
- 搜狗笔试:有两个数,A和B,六种操作分别是+12,-12,+7,-7,+5,-5。A经过若干次操作,变成B
- 搜狗笔试:有两个数,A和B,六种操作分别是+12,-12,+7,-7,+5,-5。A经过若干次操作,变成B
- 搜狗笔试:有两个数,A和B,六种操作分别是+12,-12,+7,-7,+5,-5。A经过若干次操作,变成B
- 给定两个正整数A和B,把A变成B需要几位?也就是说A和B之间的位数有多少个是不同的?
- oj 给你两个数a和b,计算出它们分别是哪两个数的最大公约数和最小公倍数
- 腾讯笔试:把两个数和告诉A,积告诉B,求这两个数是什么
- 腾讯笔试:把两个数和告诉A,积告诉B,求这两个数是什么
- 腾讯笔试:把两个数和告诉A,积告诉B,求这两个数是什么 .
- 腾讯笔试:把两个数和告诉A,积告诉B,求这两个数是什么
- 腾讯笔试:把两个数和告诉A,积告诉B,求这两个数是什么
- 腾讯笔试:把两个数和告诉A,积告诉B,求这两个数是什么
- 腾讯笔试:把两个数和告诉A,积告诉B,求这两个数是什么
- 求a和b两个数之和
- 求a和b两个数之和
- 求A和B两个数之和
- 面试题—有两个无刻度的水桶,分别能装7升水(记为A)和5升水(记为B),那么通过这两个桶可能获得多少升水
- 有三个线程ID分别是A、B、C,请有多线编程实现,在屏幕上循环打印10次ABCABC
- 有三个线程ID分别是A、B、C,请有多线编程实现,在屏幕上循环打印10次ABCABC
- Android中Shape 和 Selector的用法
- Linux下Nagios的安装与配置
- 3、struts2 默认配置、数据处理的集中方式、请求数据封装、日期转换器
- C++实验5--数组分离
- Js实现下拉菜单
- 搜狗笔试:有两个数,A和B,六种操作分别是+12,-12,+7,-7,+5,-5。A经过若干次操作,变成B
- 南阳OJ上的一个题
- Java多线程编程
- mybatis xml文件中大于小于符号解释
- 动物园的猴子
- 浅谈外包管理
- 前端实践--JavaScript--事件
- 使用javascript实现二级联动菜单
- 莫队算法学习小记