我在采访中遇到一个问题,一个男人可以后退或向前移动两倍的距离。将它们视为单个动作,找出他可以从x到达y的最小动作。
import java.util.*;
import java.io.*;
public class Main
{
public static int Solve(int x,int y)
{
if(x==0)
{
return Integer.MAX_VALUE;
}
else if(x==y)
{
return 0;
}
else if(x==1)
{
return 1+Solve(x*2,y);
}
return Math.min(1+Solve(x*2,y),1+Solve(x-1,y));
}
public static void main(String[] args)
{
Scanner sc=new Scanner(System.in);
int x=sc.nextInt();
int y=sc.nextInt();
int z=Solve(x,y);
System.out.print(z);
}
}
答案 0 :(得分:0)
这是一个无限循环。将在什么地方求解(x * 2,y) 停止吗?
由于定义了int x和int y,因此假设所有这些仅在一个轴(1D)中。假设我们有x和y,如果y-x为正,则意味着我们必须前进。现在,如果y-x为奇数,则假设7表示我们必须先前进8步(4 * 2),然后再返回1(1步)。给我们5个步骤。所以我们必须去
(((y-x) + 1)/2) + 1
所以7 + 1 = 8,我们向前走了8步,走了两步,然后又走了1步。 如果是偶数,则意味着我们可以继续前进!所以
(y-x)/2
如果y-x为负,则意味着我们必须返回。唯一的办法是后退1个(x-1),这样就可以了
-(y-x) steps.
您可以编写代码。我喜欢您的代码的递归方面,但是如果是一维,那就太过分了。
答案 1 :(得分:0)
不确定此处是否需要基于递归的解决方案。
我们在这里有两个子问题:
from >= to
时,to - from
为奇数的情况下,计数向前移动:则需要再向前移动1次,向后退1步。这可以在三元运算符的帮助下解决:
public static int findMoveCount(int from, int to) {
return from >= to ? from - to : (to - from) % 2 * 2 + (to - from)/2;
}