【发布时间】:2012-10-18 16:07:13
【问题描述】:
我编写了一个小程序来生成具有 2 个条件的数字:
- 具有从 1 到 9 的所有数字,所以像 123456789 这样的数字
- 数字必须能被最后一位整除 例如 442 因为 4 % 2 == 0 和 4 % 4 == 0
这是我的回溯算法:
static void backTrack(int value)
{
//Check if the number has all 9 digits, that it is dividable
if(isNine(value) && isDiv(value))
{
//System.out.println(value);
System.out.println("Found solution.");
System.out.println(aantal);
aantal++;
}
else
{
if(howMany(value) >= 9)
return;
for(int i = 1; i < 10; i++)
{
value = value * 10 + i;
if(value % i == 0 && howMany(value) <= 9)
{
//System.out.println(value);
backTrack(value);
}
value = value / 10;
}
}
}
//Gives length of integer for example 124 must give 3, 13 gives 2
static int howMany(int value)
{
int test = value % 10;
value = value / 10;
int teller = 0;
while(test != 0)
{
teller++;
test = value % 10;
value = value / 10;
}
return teller;
}
//Checks if the number is dividable by the last digit of the number and keeps recursive doing this for the whole number so 442 = YES 235 = NO
static boolean isDiv(int value)
{
int test = value % 10;
value = value / 10;
while(test != 0)
{
if(value % test == 0)
{
test = value % 10;
value = value / 10;
}
else
return false;
}
return true;
}
//Checks if the number has all digits from 1 to 9
static boolean isNine(int value)
{
boolean values[] = new boolean[10];
int test = value % 10;
int counter = 0;
for(int i = 1; i < values.length; i++)
values[i] = false;
while( test != 0)
{
if(values[test])
return false;
else
{
values[test] = true;
value = value /10;
test = value % 10;
}
}
for(int i = 1; i < values.length; i++)
{
if(values[i])
counter++;
}
if(counter == 9)
return true;
else
return false;
}
它永远不会找到解决方案,我测试了所有子功能,并且效果很好。
我的回溯方案有问题吗? System.out.println(aantal) 只是一个变量,用于计算我找到了多少解决方案。
我从backtrack(0);开始
【问题讨论】:
-
您可能需要设置最小和最大范围。
-
让它运行?您的意思是在例如 1000 次尝试后程序停止?因为它应该打印一些东西,所以我让它无限运行,所以有没有满足这个条件的数字?
-
你只有什么数字有一定的长度?因为你这样做: if(howMany(value) >= 9) return;
-
如果唯一有效的解决方案中包含 9 位数字,则无需费心测试少于 9 位数字的任何内容,您可以节省大量时间。从 0 开始,您的算法首先测试 0、1、11、111 等,并在到达第一个 9 位候选者之前进行大量计算。另外,我会重新考虑您如何通过搜索空间进行 -
value = value * 10 + i是否在开始添加 2 之前测试所有的,等等。 -
是的,那是我的错。如果测试,我更改了解决方案,现在它可以工作并且数字是正确的:-)。立即发布解决方案。
标签: java backtracking