跳石板(待改进)

来源:互联网 发布:java api百度云盘 编辑:程序博客网 时间:2024/05/08 05:49

题目描述

小易来到了一条石板路前,每块石板上从1挨着编号为:1、2、3……. 
这条石板路要根据特殊的规则才能前进:对于小易当前所在的编号为K的 石板,小易单次只能往前跳K的一个约数(不含1和K)步,即跳到K+X(X为K的一个非1和本身的约数)的位置。 小易当前处在编号为N的石板,他想跳到编号恰好为M的石板去,小易想知道最少需要跳跃几次可以到达。 
例如: 
N = 4,M = 24: 
4->6->8->12->18->24 
于是小易最少需要跳跃5次,就可以从4号石板跳到24号石板 .

输入描述

输入为一行,有两个整数N,M,以空格隔开。 
(4 ≤ N ≤ 100000) 
(N ≤ M ≤ 100000)

输出描述

输出小易最少需要跳跃的步数,如果不能到达输出-1

样例输入

4 24

样例输出

24


思路:递归;

结果:运行慢。。。


#include <stdio.h>

int now_step;
int end_step;
int flag = 0;
int sucess;
int show_min = -1;


void fun(int my_moment_step,int moment_i,int min)
{
// printf("my_moment_step = %d %d %d \n",my_moment_step,moment_i,min);
int i;
// int this_min = min;
if(moment_i != -1)
{
i = moment_i;
}
else
{
i = 2;
}
if(min != -1)
{
show_min = min;
}
while(i < my_moment_step && i <= end_step - my_moment_step)
{
// printf("\n 此时%d\t",my_moment_step);
// printf("  flag = %d\t",flag);
// printf("i = %d\n",i);
if((my_moment_step + i) % i == 0)
{
min++;
if(my_moment_step + i < end_step)
{
// printf("\n 跳转前my_moment_step = %d %d %d \n",my_moment_step,i,min);
// printf("跳转时 i =%d\n",i);
// printf("跳转后my_moment_step = %d %d %d \n\n",my_moment_step+i,i,min);
fun(my_moment_step + i,-1,min);
if(flag == 1)
{
min--;
flag = 0;
}  
}
else if(my_moment_step + i == end_step)
{
// printf("SUCCESS!!\t");
// printf("为什么 = %d\n",show_min);
if(show_min != -1 && show_min > min)
{
show_min = min;
}
printf("my_moment_step = %d %d %d \n",my_moment_step+i,i,min);
printf("  wuyu %d\n",show_min);
printf("!!!!!!!!!!!!!!!!!!!show_min = %d\n\n",min);
if(sucess > min)
{
sucess = min;
}
flag = 1;
return;
}
}
i++;
}
flag = 1;
return;
}
int main()
{
while(1)
{
int moment_step = 0;


scanf("%d %d",&now_step,&end_step);
// printf("%d %d\n",now_step,end_step);
sucess = end_step;

fun(now_step,-1,0);//主操作
if(sucess == end_step)
{
printf("final = -1");
}
else
{
printf("final = %d\n",sucess);
}
}
return 0;
}
0 0