1. 程式人生 > >跳石板(待改進)

跳石板(待改進)

題目描述

小易來到了一條石板路前,每塊石板上從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;
}