2012-04-04 102 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