【问题标题】:java backtracking generating numbersjava回溯生成数字
【发布时间】:2012-10-18 16:07:13
【问题描述】:

我编写了一个小程序来生成具有 2 个条件的数字:

  1. 具有从 1 到 9 的所有数字,所以像 123456789 这样的数字
  2. 数字必须能被最后一位整除 例如 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


【解决方案1】:
static void backTrack(int value)
    {
        //Check if the number has all 9 digits, that it is dividable
        if(isNine(value)) // CHANGED this if test. 
        {
            System.out.println("Found solution.");
            System.out.println(value);
            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 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;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2018-09-08
    • 2023-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多