任何人都可以给我一个想法,我如何在 Java 中计算以下问题。多少个可能的有效数字,其中有效数字是 0-9 之间的任何数字,长度为 10 位,不包括 # 或 *,棋子在通过电话键盘时可以追踪。假设我有一个国王,它只能像在真正的游戏中一样向任何方向移动,但一次只能移动一个单元格。
所以键盘看起来像这样:
1 2 3
4 5 6
7 8 9
* 0 #
所以棋子每次移动 10 步,它创建的每个唯一数字都是有效数字。一块从最初的起始位置开始它的旅程。
更新:一块可以移动或停留在一个地方(移动或停留都将被视为移动)以及重新访问单元格(只要其允许在各自的移动权限内)。因此,例如,如果国王从位置 1 移动,则创建有效数字的三个有效 10 步路径数字可能是 1236547890 或 1111111111 或 1212121212
这是一个小型版本的四格方形垫的代码,只有 4 个格子,仅用于测试目的:
public class King
{
private static final Integer[] ALLOWED_FROM_1 = {2, 3, 4};
private static final Integer[] ALLOWED_FROM_2 = {1, 3, 4};
private static final Integer[] ALLOWED_FROM_3 = {1, 2, 4};
private static final Integer[] ALLOWED_FROM_4 = {1, 2, 3};
List<Integer> visited;
public King()
{
this.visited = new ArrayList<Integer>();
}
public List<Integer> get_destinations(int currentPos, int noOfMoves)
{
if (noOfMoves == 0)
{
visited.add(currentPos);
return visited;
}
else
{
List<Integer> possibleMoves = getPossibleMoves(currentPos);
for (int i = 0; i < possibleMoves.size(); i++)
{
visited.add(possibleMoves.get(i));
get_destinations(possibleMoves.get(i), noOfMoves - 1);
}
return visited;
}
}
private List<Integer> getPossibleMoves(int currentPos)
{
List<Integer> possibleMoves = new ArrayList<Integer>();
switch (currentPos)
{
case 1 : possibleMoves.addAll(Arrays.asList(ALLOWED_FROM_1));
break;
case 2: possibleMoves.addAll(Arrays.asList(ALLOWED_FROM_2));
break;
case 3 : possibleMoves.addAll(Arrays.asList(ALLOWED_FROM_3));
break;
case 4 : possibleMoves.addAll(Arrays.asList(ALLOWED_FROM_4));
}
return possibleMoves;
}
}
上面的代码只产生了部分答案,缺少许多不同的排列。主要问题是我如何才能确保它产生所有排列,以及在上面的代码中什么时候准确地到达应该存储并稍后检索的 4 位数字(在 4 次移动之后)。另外,我怎样才能避免重新访问相同的序列,例如 1234 1234 ,所以基本上优化它,这样它就不会产生相同的路径序列/有效数字。
非常感谢所有帮助。