2012-10-16 95 views
2

我有一個二維數組,它代表了一個數獨遊戲。在Java中比較數組中的值?

我試圖檢查遊戲的錯誤使用典型的數獨遊戲:

無數字(1-9)是行,列或3×3平方米範圍內重複。 沒有空單元格。

我很新到Java,所以我只在有限的知識,來處理這個。我將嘗試一個比較所有單元格的long if,else語句。這沒有用,因爲-1被重複了。 (-1代表空方塊)。我試圖解決這個問題,但意識到如果這個陳述過於混亂,並且必須有更好的方法。

我現在認爲最好的方法是使用嵌套for循環遍歷每行,每列和3x3方塊。另一方面檢查空單元格,我想我已經想通了。 (在二維數組中嵌套用於檢查-1的語句)。

我也在考慮把所有的數字加在一行,一列或3x3的方格中,如果它不等於45,那麼遊戲仍然不完整?

至於檢查重複值,我不知道如何實現嵌套的。

編輯:讓我澄清一下,我並不是真的想檢查重複值每說,我只是希望遊戲保持不完整,如果有重複的價值。 (例如,允許重複值,就像真正的數獨謎題一樣,不會贏得遊戲)。我覺得加入45方法最好。

+0

首先實現這個方法:'公共布爾hasDuplicates(int ...數字)'。如果你只能執行一次,那麼只需要改變你傳遞給列,行或3x3方塊的內容。給一個鏡頭,並顯示你已經嘗試過。 –

回答

4

如果您不檢查整個遊戲板是否存在所有重複項,您可以真正簡化一些事情,但是隻有當新值爲時,才能檢查特定的行,列和3x3方塊是否沒有重複項放置(無論是由玩家,還是從文件加載遊戲時)。

這樣,你只需要三個非嵌套循環。其中每一個都要檢查所放置的新值是否已經存在於其行,列和3x3方塊中。

您也不需要擔心檢查-1(假設您已經錯誤地檢查了值1-9的輸入)。

注意:「檢查行,列或3x3方塊合計爲45」不起作用。這是一個不錯的主意,但它不會捕獲多個副本(例如,所有5的一行都會通過)。

0

這是一個很好的問題,我很無聊,所以這裏有一個相當完整的描述。當然,還有很多其他的!這種方法是有效的,但不是特別優雅。我想看看其他人提出了什麼。

1)爲每個行,列和3x3方塊製作一個BitSet對象。把這些數組中,就像這樣:

// Initialize arrays 
BitSet[] rows = new BitSet[9]; 
BitSet[] cols = new BitSet[9]; 
BitSet[] squares = new BitSet[9]; 
// Initialize the array elements 
for(int i=0;i<9;i++){ 
    rows[i] = new BitSet(9); 
    cols[i] = new BitSet(9); 
    squares[i] = new BitSet(9); 
} 

現在我們就可以在網格中的一個通和在適當的行,列和廣場設置了一下。 「適當的」我的意思是,如果我們在看我行j 專欄中,我們將設置位和rows[i]cols[j]。索引正方形的元素,我們將使用以下佈局:

0 1 2 
3 4 5 
6 7 8 

我們可以通過簡單地將i和j通過3。因此,我們希望該指數i/3 + 3 * (j/3)獲得上述佈局的行和列。請注意,整數除法在這裏工作,所以7/3 == 8/3 == 2,這意味着我和j等於8,我們有例如8/3 + 3 * (8/3) = 2 + 3 * 2 = 8

全部放在一起,我們可以寫的方法來檢查,如果讓人不解的是沒有解決這樣的:

public boolean hasRepeats(){ 
      // ... 
     // initialize rows, cols, and squares as above 
      // ... 

    for(int i=0;i<9;i++){ 
     for(int j=0;j<9;j++){ 
      int gridValue = grid[i + 9 * j]; 
      if(gridValue == -1){ 
       // Skip empty squares 
       continue; 
      } 
      // Check for repeats 
      if(rows[i].get(gridValue)){ 
       return true; 
      } 
      rows[i].set(gridValue); 
      if(cols[j].get(gridValue)){ 
       return true; 
      } 
      cols[j].set(gridValue); 
      BitSet square = squares[ i/3 + 3 * (j/3) ] 
      if(square.get(gridValue)){ 
       return true; 
      } 
      square.set(gridValue); 
     } 
    } 
    return false; 
} 
0

既然你是新來的Java,我假設你正在使用二維整型數組來存放3x3廣場。您的目標是驗證廣場中存在的任何重複的整數(除-1)。

private static final int WIDTH = 3; 
private static final int HEIGHT = 3; 
private static int[][] cells = new int[WIDTH][HEIGHT]; 

,您可以通過-1

for (int i = 0; i < WIDTH; i++) { 
    for (int j = 0; j < HEIGHT; j++) { 
     cells[i][j] = -1; 
    } 
} 

一個簡單的方法是初始化二維數組用列表來臨時存儲用戶的輸入,並檢查是否添加輸入已經存在。

private static boolean validateCells() { 
    boolean isValid = true; 
    List<Integer> inputValues = new ArrayList<Integer>(); 
    for (int i = 0; i < WIDTH; i++) { 
     for (int j = 0; j < HEIGHT; j++) { 
      int inputValue = cells[i][j]; 
      if (inputValue != -1) { 
       if (inputValues.contains(inputValue)) { 
        isValid = false; 
        break; 
       } else { 
        inputValues.add(inputValue); 
       } 
      } 
     } 
    } 
    return isValid; 
} 

這顯然不是一個有效的方法,但它的簡單,很容易理解的Java初學者。

0

一個簡單的方法是通過感應正確。將加載9個值的數組,然後執行下列操作:

  1. 轉換爲一組,以確保沒有重複
  2. 轉換回的陣列
  3. 排序數組

然後你就可以檢查3個,做事能保證有效值爲:

  1. 檢查第一個數字(即最低)爲1
  2. 檢查的最後一個數字(即最高)是9
  3. 檢查數組的長度爲9(所以你沒有,其實有目前所有9號)