2012-07-29 268 views
3

我已經開始一個項目,試圖創建一個Ken Ken難題。如果你不確定Ken Ken是什麼,它就像Sudoku一樣,在行或列中不能有重複的整數值。用隨機數字填充二維數組

我正在嘗試使用爲每個新行創建的數組列表中的數字填充二維數組。我將檢查數組列表中的數字是否與其自己的行和列中的數字不匹配。

當我運行我的代碼時,當我嘗試從列表中刪除整數值時,出現「Index Out Of Bounds」異常。我不知道爲什麼會發生這種情況,因爲我認爲我得到了正確的因素。

這裏是我的代碼:

int GRID_SIZE = 4; int[][] grid = new int[GRID_SIZE][GRID_SIZE]; List<Integer> nums = new ArrayList<Integer>();

private void populateGrid() { 

    for (int row = 0; row < GRID_SIZE; row ++) { 

     // Creates an array of values from 1 to grid size. 
     for (int i = 1; i <= GRID_SIZE; i++) nums.add(i); 

     for (int col = 0; col < GRID_SIZE; col++) { 

      while (nums.size() > 0) { 

       // Gets a random number from the Array List 
       int ranNum = nums.get(numGen.nextInt(GRID_SIZE)); 

       // Checks to see if the number is placeable. 
       if (canPlace(ranNum, row, col)) { 

        // Places the number in the 2D Array 
        grid[row][col] = ranNum; 
        break; 

       } else { 

        // Removes duplicate element from the Array List. 
        nums.remove(ranNum); <------{Index Out Of Bounds Exception] 
       } 
      } 
     } 
    } 
} 

private boolean canPlace(int ranNum, int row, int col) { 

    for (int i = 0; i < GRID_SIZE; i++) { 

     // Checks if the specified number is already in the row/column. 
     if (grid[col][i] == ranNum) return false; 
     if (grid[i][row] == ranNum) return false; 
    } 

    return true; 
} 

我有這幾個問題:

首先,爲什麼我得到錯誤我是

其次還有什麼更好的比一個二維數組,網格和我把我的號碼方式使用?

最後,上午我正在使用中斷

在此先感謝您的答案。

+0

這似乎錯在第二個for循環:'我<= GRID_SIZE'您正在使用什麼確切的數據類型來存儲隨機數一覽表 – Keppil 2012-07-29 22:21:58

+0

?如果它是一個列表,那麼當你刪除東西時它可能會縮小,所以如果你的列表有9個,並且你找到一個並刪除它,那麼它現在有8個。如果你再次查看第9個位置,這是一個超出界限例外 – 2012-07-29 22:22:42

+0

我真的不知道從哪裏開始。即使小問題得到解決,您的整個方法似乎都是錯誤的,並且無法解決最棘手的問題。你需要回溯。 – 2012-07-29 22:22:54

回答

1

如何解決問題的不同方法?從一個有效的方塊開始並轉換它。兩個操作「交換兩行」和「交換兩列」保留了廣場的屬性。這可以讓你做兩個Fisher-Yates洗牌,一個在行上,一個在列上,只要你從一個有效的方塊開始,它就會給你一個有效的隨機方塊。構建初始有效方很簡單:

123456 
234561 
345612 
456123 
561234 
612345 
+0

非常感謝你,我嘗試了這個想法,並且已經完成了它(與許多其他益智遊戲一起)。謝謝! – 2012-08-21 08:02:27

2

IndexOutOFBoundsException是因爲List API中的故障(IMO)而發生的。它有一個remove(Object element)方法,這就是你想要調用的方法,和一個remove(int index)方法,這就是你實際調用的方法。後者試圖刪除給定索引處的元素,這不在那裏,因爲您的參數可能大於列表大小。 您可以將ranNum變量轉換爲IntegerObject以確保您調用正確的方法。

+0

非常感謝你的回答,我一直認爲int和Integer是一樣的,這是我學到的一個很好的教訓。我現在已經修復了我的代碼,現在它正在正常工作,再次感謝! – 2012-07-30 04:33:30

1
for (int i = 0; i <= GRID_SIZE; i++) nums.add(i); 

這對我沒有多大意義。您正在添加0-4的數字。您的數組中只有索引達到3。 0-1-2-3 ...

沒有真正看到更多的代碼,或確切地知道你在哪裏得到你的索引越界...這是在黑暗中拍攝。

+0

感謝您的回覆,我現在糾正了它,並且獲得了我想要的數字。 – 2012-07-30 04:31:49

+0

@Jordan King如果答案是正確的,你應該接受它作爲正確的答案,以便讓人們知道什麼是錯的。很高興幫助。 – 2012-08-01 21:52:29

0

在給我的代碼再看一遍之後,我意識到我的主要錯誤是與canPlace(int ranNum, int row, int col)方法有關。

我所做的只是交換colrow它的工作。

感謝大家的幫助。