0

2D配列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 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];
      }
  }

注: いくつかの母音を上書きしますが、これで問題ありません。

于 2012-04-04T09:23:48.570 に答える
0

最初の列/最初の行のコンテンツがAであり、最初の列/2 番目の行にいる場合、切り捨てられた配列を使用できます。つまりString [] availableVowels = {"E","I","O","U"};、から選択できます。を選択Oした場合、1 列目/3 行目にいる場合は から選択しますString [] availableVowels = {"E","I","U"};。等

于 2012-04-04T08:59:43.533 に答える
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 に答える