Python巧解数字变换问题,有点意思(65)

小朋友们好,大朋友们好!

我是猫妹,一名爱上Python编程的小学生。

和猫妹学Python,一起趣味学编程。

今日主题

如何用Python解决数字变换问题

比如:

对于一对正整数a和b,对a只能进行加1,减1,乘2操作,问最少对a进行几次操作能得到b?

a=3,b=11,3*2*2-1=11,3次操作得到11

编程思路

数字变换问题属于状态迁移图问题,可以用广度优先搜索,寻找a到b状态迁移最短路径。

扫描二维码关注公众号,回复: 16968861 查看本文章

对于每个状态s,可以转换到是s+1、s-1、s*2。

编程步骤:

1.把初始状态a入队

2.出队一个状态s,然后把s+1,s-1,s*2入队

3.反复循环2,直到状态s为b

今日主题

代码实现(代码见同名公众号,次条推文):

代码逻辑:

3行:函数atob的参数a和b,表示起始数据a,终点数据b,返回值c表示经过的变换次数。

4行:创建一个队列,队列元素为元组。元组中第一个元素为当前数字、第二个元素为经过的变换次数。

5行:已经经过判断过但是不符合的数字,需要将其过滤掉。

避免重复判断,比如+1-1无限循环。

6~21行:依次从队列中取出一个元素,判断是否满足要求。

如果满足要求,退出循环。否则,将其变换值(+1,-1,*2)加入队列。

7行:从队列中弹出一个元素,该元素为元组。s,c分别表示当前数字,经过变换的次数。

8~9行:经过的变换等于预期值,退出循环。

11~17行:当前数字小于预期值时,允许它向大处变换。

新的状态值之前没有被判断过,才可以加入队列,才可以加入已判断集合。

18~21行:当前数字大于预期值时,允许它向小处变换。

新的状态值之前没有被判断过,才可以加入队列,才可以加入已判断集合。

22行:返回经过的变换次数。

怎么样?

你理解了吗?

好了,我们今天就学到这里吧!

如果遇到什么问题,咱们多多交流,共同解决。

我是猫妹,咱们下次见!

猜你喜欢

转载自blog.csdn.net/parasoft/article/details/131405786