小朋友们好,大朋友们好!
我是猫妹,一名爱上Python编程的小学生。
和猫妹学Python,一起趣味学编程。
今日主题
如何用Python解决数字变换问题
比如:
对于一对正整数a和b,对a只能进行加1,减1,乘2操作,问最少对a进行几次操作能得到b?
a=3,b=11,3*2*2-1=11,3次操作得到11
编程思路
数字变换问题属于状态迁移图问题,可以用广度优先搜索,寻找a到b状态迁移最短路径。
对于每个状态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行:返回经过的变换次数。
怎么样?
你理解了吗?
好了,我们今天就学到这里吧!
如果遇到什么问题,咱们多多交流,共同解决。
我是猫妹,咱们下次见!