我有一个难题,我需要通过删除一些条件中的17来减少一个数字为零。以下是您理解的难题。最快的硬币移动
从138个硬币开始,找到最少移动次数达到0个硬币。随着每一步你可以(a)丢弃17个硬币,(b)丢弃1个硬币或(c)丢弃一半硬币(但只有当你有偶数个硬币时)。编写一个程序,测试所有可能的移动组合并打印最快移动组合所需的移动次数。
我发现使用下面的代码最快的移动。现在,我需要找出其他可能的动作,但我坚持下去。有人能帮忙吗?
package com.infy.cis.test;
public class CoinMovementPuzzle {
static int times=0;
public static void main(String[] args) {
// TODO Auto-generated method stub
numDiv(138,2,17,1);
}
public static void numDiv(int a, int b,int c,int d) {
if(a!=0)
{
int remainder=a%b;;
if(remainder==0 && a>=2)
{
evenNumber(a,b);
}
else if(remainder!=0 && a>=17)
{
oddNumber17(a,c);
}
else
{
oddNumber1(a,d);
}
}
System.out.println("FINAL"+times);
}
private static void oddNumber1(int a,int d) {
// TODO Auto-generated method stub
a=a-d;
times=times+1;
System.out.println("odd number::"+a+"::"+times);
numDiv(a, 2,17,1);
}
private static void oddNumber17(int a,int c) {
// TODO Auto-generated method stub
//int rem;
int rem=a%c;
a/=c;
times=times+a;
System.out.println("odd number::"+a+"::"+times);
numDiv(rem, 2,17,1);
}
private static void evenNumber(int a,int b) {
// TODO Auto-generated method stub
a/=2;
times=times+1;
//System.out.println(a/=b);
//remainder=a%b;
System.out.println("Value of a"+a);
System.out.println("even number::"+a+"::"+times);
numDiv(a, 2,17,1);
}
}
从格式化您的代码开始,然后请告诉我们您卡在哪里以及您尝试了什么。 – Thomas
http://stackoverflow.com/questions/29780471/java-program-for-fastest-coin-move-combination –
我认为你要找的是[广度优先搜索](http://en.wikipedia .ORG /维基/广度first_search)。创建一棵树,其中第一次移动是一半,17和1.这创建了3个节点。对于每个节点,使用合法移动创建新节点。当你创建了所有的节点时(换句话说,当你的所有子节点都是零)时,你已经创建了一个包含所有移动组合的树。 –