任何人都可以給我一個想法,我如何用Java解決以下問題。有多少個可能的有效數字,其中有效數字是0-9之間的任何數字,10位數字的長度,不包括#或*,一張國際象棋可以在通過電話鍵盤旅行時跟蹤。這裏說我有一個國王,它只能像在真正的遊戲中一樣,以任何方向移動,但一次只能移動一個單元格。Java - 多少個數字的組合
因此鍵盤看起來是這樣的:
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,所以基本上對其進行了優化,使其不會產生相同的路徑序列/有效數字。
所有幫助非常感謝。
什麼棋?這些中的任何一個?你試過什麼了? – Romain 2012-04-26 14:42:01
是否有固定的起始位置? – 2012-04-26 14:42:58
聽起來像功課,如果是的話,小心添加相應的標籤? – Gamb 2012-04-26 14:44:30