小学生游戏
题目规则 题目先给出数a(a是一个正整数,不超过50位),再给出目标数b(同样是一个正整数,不超过50位), 数的运算有三种: 1:使当前数加上1985429 2:使当前数加上2006 3:使当前数乘2
例1:小艺给出数a=1,给出数b=1987437 那么最快我们经过3次指定运算可以使1变成1987437 1 例1:小艺给出数a=1,给出数b=1987437 那么最快我们经过3次指定运算可以使1变成1987437 1*2=2;(第3种变换) 2+1985429=1985431;(第1种变换) 1985431+2006=1987437;(第2种变换) 例2:小艺给出数a=1,给出数b=128 那么最快我们经过7次指定运算可以使1变成128 1*2*2*2*2*2*2*2=128(均采用第3种变换),但是因为n>6,所以按题意输出-1。
1.模型 将状态A转化为状态B 2.算法设计 比较容易想到的也是比较典型的 深度优先搜索,广度优先搜索 3.比较两种算法 因为是求最短的变换次数,考虑用广度优先搜索. 优点:搜索到的结果必然是变换次数最少的 缺点:需要较大存储空间(以空间为代价)
结构图
广度优先搜索 广度优先实行一层一层扩展结点 Q1=1;//指向每一层第一个结点 Q2=1;//指向每一层最后一个结点 do { for (i=Q1;i<=Q2;i++) expand(i);//扩展第i个结点 Q1=Q3;//改变Q1指向下一层第一个结点Q3 Q2=Q4;//改变Q2指向下一层最后一个结点Q4 }while((Q1>Q2)||(解的数目num>0));
广度优先搜索 具体扩展每个结点的过程 Void expand(int i) { for (j=1;j<=n;j++) then { 记录新结点;判断是否为解; Q4++; }
值得注意的地方 1.变换次数为0的情况 如果算法不能照顾到这种情况,那就事先先判断处理一下. 2.大数据的情况 数据精度不够,或者数据会溢出.考虑用高精度.(用数组存储一个大数)