2012-04-04 95 views
0

我試圖通過二維數組生成Sudoku板:board [5] [5]。 Sudoku板應該只包含獨特的元音。但是,我只讓獨特的元音連續出現。對於列,他們似乎仍然有重複。我想如何生成一個沒有重複使用我迄今爲止的代碼的列?如何刪除java中的二維數組中的副本?

下面的代碼我有連續產生獨特的字母:

String [] vowels = {"A","E","I","O","U"}; 
String [][] board = new String [vowels.length][5]; 

public Actions(){ 
    int rows = 5; 
    for(int row = 0;row<rows;row++){ 
     ArrayList<String> tempVowels = new ArrayList<String>(Arrays.asList(vowels)); 
     int numVowPerLine = (int)Math.floor(Math.random()*4); 
     for(int j = 0;j<numVowPerLine;j++){ 
      do{ 
       int pos = (int)Math.floor(Math.random()*5); 
       if(board[row][pos] == null){ 
        int temp = (int)Math.floor(Math.random()*tempVowels.size()); 
        board[row][pos] = tempVowels.get(temp); 
        tempVowels.remove(temp); 
        break; 
       } 
      }while(true); 
     } 

    } 

貸:L7ColWinters

回答

2

這與一個相當知名的問題有關,稱爲Rooks Problem

我可以建議一個更簡單的循環嗎?

編輯:在閱讀評論後,我發現問題需要應用到每個元音。在我看來,這是更可讀:

java.util.Random random = new Random(); 

boolean[] r_occupied; 
boolean[] c_occupied; 

for (i = 0; i < vowels.length; i++) 
    { 
    // Clear the 'occupied' information 
    r_occupied = new boolean[5]; 
    c_occupied = new boolean[5]; 

    // we will put vowel[i] 'count' times into the 'board' 
    count = random.nextInt(5); 

    for (j = 0; j < count; j++) 
     { 
     // generate a random row 
     row = random.nextInt(5); 

     // if it is already occupied, select the next one 
     while (r_occupied[row]) 
      row = (row + 1) % 5; 

     // generate a random column 
     col = random.nextInt(5); 

     // if it is already occupied, select the next one 
     while (c_occupied[col]) 
      col = (col + 1) % 5; 

     /* put the vowel at board[row][col] */ 
     r_occupied[row] = true; 
     c_occupied[col] = true; 
     board[row][col] = vowel[i]; 
     } 
    } 

注意:它會覆蓋一些元音,但這應該是確定的。

+0

嗯...我明白,與此代碼,代碼將沒有重複。那麼整個2D陣列會被填滿嗎? – javaBeginner 2012-04-04 10:07:25

+0

Erm,代碼將5個元音填充到5x5板上的5個正確的插槽中。這不是你要做的嗎?其他職位空空如也,你可以隨心所欲地做你想做的事情。 – ArjunShankar 2012-04-04 13:00:12

+0

當我試過這段代碼時,它只顯示一行中的一個字母和一列中的同一個字母。我最初的問題是用null替換重複以擦除重複。 – javaBeginner 2012-04-04 13:17:28

0
  1. 如果 已經包含這個連續檢查添加額外的元音字符之前元音和continue您可以傳遞到 其他元音
  2. 您也可以通過切換來爲列執行相同的操作前

這樣的:

board[row][pos] = tempVowels.get(temp); 

這樣寫:

boolean b = false; 

    for(int j = 0;j<columnLength; j++){ 
     if(board[row][j] == tempVowels.get(temp)) 
      b= true; 

     if(b == true) 
     { 
      b = false; 
      continue; 
     } 
     board[row][pos] = tempVowels.get(temp); 
    } 
+0

這是否意味着在繼續之前應該在行內檢查檢查器? – javaBeginner 2012-04-04 09:02:04

+0

因爲問題是在列中有重複,但不在行中。 。 。 – javaBeginner 2012-04-04 09:09:04

+0

是的,你是正確的,你解決了你的問題 – GingerHead 2012-04-04 13:31:12

0

如果第一列/第一行的內容爲A,你是在第一列/第二排,您可以使用截斷數組,即String [] availableVowels = {"E","I","O","U"};,從中進行選擇。如果您選擇O,那麼當您位於第一列/第三排時,您可以從String [] availableVowels = {"E","I","U"};中進行選擇。等等。

+0

如果我的整個董事會已經填充元音會怎麼樣?我將如何能夠實現你所說的? – javaBeginner 2012-04-04 09:04:34