键盘上的所有可能数字

时间:2012-12-20 06:50:31

标签: algorithm graph

我正试图解决这个问题:

1  2  3
4  5  6
7  8  9
*  0  #

给定起始编号,找到所有可能的6位数字,数字只能水平或垂直拨打。不允许重复。数字不能从零开始,不包括*和#。例如,如果上次拨打的号码是3,则下一个号码可以是1,2,6或9。

我正在尝试创建一个图形,其中一个数字只有相邻的数字在同一行和列中,然后从起始编号中找到长度为5的所有可能路径。但是我不知道这样做的算法..

有什么建议吗?

4 个答案:

答案 0 :(得分:2)

假设数字存储在2-d数组NUMPAD中,其中“1”位于索引[0] [0],“2”位于索引[0] [1],等等。 / p>

Func permute_nums(digits_so_far)
    If digits_so_far has 6 elements
        print digits_so_far
        return
    Let L = last element of digits_so_far
    Find index (x,y) of L in NUMPAD
    For i from -2 to +2
        if (x+i,y) is NOT out of bounds
            Find number n at (x+i,y)
            permute_nums(digits_so_far + [n])
        if (x,y+i) is NOT out of bounds
            Find number m at (x,y+i)
            permute_nums(digits_so_far + [m])

给定起始位s,执行permute_nums([s])

答案 1 :(得分:0)

我认为你走的是正确的道路。 只需遍历树(标记每个被访问节点,以避免重复),并输出长度为5的每条路径。

你真的不需要任何新东西,即使只限于深度5的基本Breadth first search也可以。

答案 2 :(得分:0)

嗯。这应该很容易。

static var a:Array=[[8],[2,4],[1,3,5],[2,6],[1,5,7],[2,4,6,8],[3,5,9],[4,8],[5,7,9,0],[6,8]];
function giveAllnumbers(numbersSoFar:String,lastSelectedNumber:int,:int) {
    if (howManyToSelectLeft==0) {
        trace(numbersSoFar); // output goes here
        return;
    }
    for (var i:int=a[lastSelectedNumber].length-1;i>=0;i--) 
        giveAllNumbers(numbersSoFar+a[lastSelectedNumber][i].toString(),
            a[lastSelectedNumber][i],
            howManyToSelectLeft-1);
}

这是Actionscript,但可以适用于任何其他语言。使用giveAllNumbers(''+yourNumber.toString(),yourNumber,desiredLength);

进行调用

答案 3 :(得分:0)

这个问题可以递归地解决,返回点将是length == 6。

private static void countMaxNumbers(String i) {
    if(i.length() == 6)
    {
        numberCount++;
        return;
    }
    if(i.charAt(i.length() - 1) == '1'){
        countMaxNumbers(i+'2');
        countMaxNumbers(i+'3');
        countMaxNumbers(i+'4');
        countMaxNumbers(i+'7');
    }
    else if(i.charAt(i.length() - 1) == '2'){
        countMaxNumbers(i+'5');
        countMaxNumbers(i+'8');
        countMaxNumbers(i+'0');
        countMaxNumbers(i+'1');
        countMaxNumbers(i+'3');
    }
    else if(i.charAt(i.length() - 1) == '3'){
        countMaxNumbers(i+'1');
        countMaxNumbers(i+'2');
        countMaxNumbers(i+'6');
        countMaxNumbers(i+'9');
    }
    else if(i.charAt(i.length() - 1) == '4'){
        countMaxNumbers(i+'1');
        countMaxNumbers(i+'7');
        countMaxNumbers(i+'5');
        countMaxNumbers(i+'6');
    }
    else if(i.charAt(i.length() - 1) == '5'){
        countMaxNumbers(i+'2');
        countMaxNumbers(i+'8');
        countMaxNumbers(i+'0');
        countMaxNumbers(i+'4');
        countMaxNumbers(i+'6');
    }
    else if(i.charAt(i.length() - 1) == '6'){
        countMaxNumbers(i+'3');
        countMaxNumbers(i+'9');
        countMaxNumbers(i+'4');
        countMaxNumbers(i+'5');

    }
    else if(i.charAt(i.length() - 1) == '7'){
        countMaxNumbers(i+'1');
        countMaxNumbers(i+'4');
        countMaxNumbers(i+'8');
        countMaxNumbers(i+'9');

    }else if(i.charAt(i.length() - 1) == '8'){
        countMaxNumbers(i+'7');
        countMaxNumbers(i+'9');
        countMaxNumbers(i+'2');
        countMaxNumbers(i+'5');
        countMaxNumbers(i+'0');
    }else if(i.charAt(i.length() - 1) == '9'){
        countMaxNumbers(i+'3');
        countMaxNumbers(i+'6');
        countMaxNumbers(i+'7');
        countMaxNumbers(i+'8');
    }else if(i.charAt(i.length() - 1) == '0'){
        countMaxNumbers(i+'2');
        countMaxNumbers(i+'8');
        countMaxNumbers(i+'5');
    }
}

答案应该是:12855