Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用深度优先搜索从手机键盘列出号码?_Java_Python_Algorithm_Data Structures_Depth First Search - Fatal编程技术网

Java 如何使用深度优先搜索从手机键盘列出号码?

Java 如何使用深度优先搜索从手机键盘列出号码?,java,python,algorithm,data-structures,depth-first-search,Java,Python,Algorithm,Data Structures,Depth First Search,我一直在尝试使用Java和Python解决电话号码簿列表问题。我写的代码可以在下面找到 给定一个数字和一个长度变量,返回将从电话键盘生成的号码列表 例如: f(4,3)将返回['474','454','478','414','412','458','456','452'] 这是我迄今为止尝试过的(Java): import java.util.ArrayList; 导入java.util.HashMap; 导入java.util.List; 导入java.util.Map; 公开课电话练习{ 公

我一直在尝试使用Java和Python解决电话号码簿列表问题。我写的代码可以在下面找到

给定一个数字和一个长度变量,返回将从电话键盘生成的号码列表

例如: f(4,3)将返回['474','454','478','414','412','458','456','452']

这是我迄今为止尝试过的(Java):

import java.util.ArrayList;
导入java.util.HashMap;
导入java.util.List;
导入java.util.Map;
公开课电话练习{
公共静态void main(字符串[]args){
整数selectedDigit=4;
整数maxIteration=4;
PhonePadNumberGenerator生成器=新的PhonePadNumberGenerator();
列表结果=generator.findUniqueNumberFromPhonePad(选择数字、最大迭代);
系统输出打印项次(结果);
}
}
类PhonePadNumberGenerator{
私有列表结果=新的ArrayList();
private List subresult=new ArrayList();
私有映射对立面=新HashMap();
private List phonePadWithDirectionList=新建ArrayList();
公用电话PadNumberGenerator(){
initPad();
对立面();
}
私有静态映射createMap(整数向上、整数向下、整数向左、整数向右){
返回新的HashMap(){
{
放置(directionnum.UP,UP);
放下(directionnum.DOWN,放下);
put(DirectionEnum.LEFT,LEFT);
put(directionnum.RIGHT,RIGHT);
}
};
}
私有void initPad(){
添加(新的PhonePadWithDirection(0,createMap(8,null,null,null));
添加(新的PhonePadWithDirection(1,createMap(null,4,null,2));
添加(新的PhonePadWithDirection(2,createMap(null,5,1,3));
添加(新的PhonePadWithDirection(3,createMap(null,6,2,null));
添加(新的PhonePadWithDirection(4,createMap(1,7,null,5));
添加(新的PhonePadWithDirection(5,createMap(2,8,4,6));
添加(新的PhonePadWithDirection(6,createMap(3,5,9,null));
添加(新的PhonePadWithDirection(7,createMap(4,null,null,8));
添加(新的PhonePadWithDirection(8,createMap(5,0,7,9));
添加(新的PhonePadWithDirection(9,createMap(6,null,8,null));
}
私人对立面(){
相反。放置(directionnum.UP,directionnum.DOWN);
相反。放下(directionnum.DOWN,directionnum.UP);
相反。放置(directionnum.LEFT,directionnum.RIGHT);
相反。放置(directionnum.RIGHT,directionnum.LEFT);
}
公共列表findUniqueNumberFromPhonePad(整数选择数字,整数最大迭代){
PhonePadWithDirection pad=phonePadWithDirectionList.get(selectedDigit);
for(directionnum方向:directionnum.values()){
subresult.add(pad.getNumber());
递归查找路径(pad、direction、maxIteration);
结果。添加(子结果);
子结果=新的ArrayList();
}
//删除不满足最大迭代(包含较少元素)的子结果//java 8解决方案
result.removeIf(r->r.size()
您可以使用
回溯
生成所有可能的数字。以下是一个可能的实现:。正如下面的伪代码所示,函数
f(d,n)
执行递归深度优先搜索,以探索符合给定约束的所有可能数字

pad = [
    "123",
    "456",
    "789",
    " 0 "
]

def valid(i, j):
    if i >= 4 or i < 0 or j < 0 or j >= 3:
        return False
    return (pad[i][j] != ' ')

delta_x = [-1, 1, 0, 0]
delta_y = [0, 0, -1, 1]

def f(d, n):
    if n == 1:
        return [d]
    if n <= 0:
        return []

    x = None; y = None

    # The following line of code can be replaced by a dict lookup which
    # stores the indices of every digit, say { 5: (1, 1), 1: (0, 0) .. }
    for i in range(0,4):
        for j in range(0,3):
            if pad[i][j] == str(d):
                x = i; y = j

    digits = []
    for i in range(0,4):
        next_x = x + delta_x[i]
        next_y = y + delta_y[i]
        if valid(next_x, next_y):
            digits.extend(f(pad[next_x][next_y], n - 1))

    return [str(d) + str(w) for w in digits]

print(f(5, 1))
print(f(1, 3))
print(f(0, 3))
pad=[
"123",
"456",
"789",
" 0 "
]
def有效(i,j):
如果i>=4或i<0或j<0或j>=3:
返回错误
返回(pad[i][j]!='')
δx=[-1,
pad = [
    "123",
    "456",
    "789",
    " 0 "
]

def valid(i, j):
    if i >= 4 or i < 0 or j < 0 or j >= 3:
        return False
    return (pad[i][j] != ' ')

delta_x = [-1, 1, 0, 0]
delta_y = [0, 0, -1, 1]

def f(d, n):
    if n == 1:
        return [d]
    if n <= 0:
        return []

    x = None; y = None

    # The following line of code can be replaced by a dict lookup which
    # stores the indices of every digit, say { 5: (1, 1), 1: (0, 0) .. }
    for i in range(0,4):
        for j in range(0,3):
            if pad[i][j] == str(d):
                x = i; y = j

    digits = []
    for i in range(0,4):
        next_x = x + delta_x[i]
        next_y = y + delta_y[i]
        if valid(next_x, next_y):
            digits.extend(f(pad[next_x][next_y], n - 1))

    return [str(d) + str(w) for w in digits]

print(f(5, 1))
print(f(1, 3))
print(f(0, 3))