0

我正在尝试通过二维数组生成数独板:board[5][5]。数独板应该只包含唯一的元音。但是,我只使独特的元音连续出现。对于这些列,它们似乎仍然有重复项。我想如何使用到目前为止的代码生成一个没有重复的列?

这是我用于连续生成唯一字母的代码:

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

4

3 回答 3

2

这与一个众所周知的问题有关,称为Rooks 问题

我可以建议一个更简单的循环吗?

编辑:阅读评论后,我发现问题需要应用于每个元音。在我看来,这更具可读性:

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];
      }
  }

注意:它会覆盖一些元音,但这应该没问题。

于 2012-04-04T09:23:48.570 回答
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);
    }
于 2012-04-04T08:57:57.870 回答
0

如果第一列/第一行的内容是A并且您在第一列/第二行,则可以使用截断数组,即String [] availableVowels = {"E","I","O","U"};从中进行选择。如果您选择O,那么当您位于第一列/第三行时,您会选择String [] availableVowels = {"E","I","U"};。等等

于 2012-04-04T08:59:43.533 回答