我正在尝试通过2D阵列生成数独板:板[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
答案 0 :(得分: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];
}
}
注意:它会覆盖一些元音,但这应该没问题。
答案 1 :(得分:0)
continue
你可以传递给
其他元音之前:
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);
}
答案 2 :(得分:0)
如果第一列/第一行的内容为A
并且您位于第一列/第二行,则可以使用截断数组(即String [] availableVowels = {"E","I","O","U"};
)进行选择。如果您选择O
,那么当您在第一列/第三行时,您可以选择String [] availableVowels = {"E","I","U"};
。等