Java 如何使用深度优先搜索从手机键盘列出号码?
我一直在尝试使用Java和Python解决电话号码簿列表问题。我写的代码可以在下面找到 给定一个数字和一个长度变量,返回将从电话键盘生成的号码列表 例如: f(4,3)将返回['474','454','478','414','412','458','456','452'] 这是我迄今为止尝试过的(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; 公开课电话练习{ 公
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))