抱歉标题不好,因为我不知道这个问题的标题应该是什么
看看我复杂的代码:
`class diverfuckyou{
public static void main(String args[])
{
int[] array = new int[5];
int[] first = new int[2];
int[] last = new int[2];
boolean check;
boolean check2;
for(int a = 0; a < 3 ; a++)
{
//
check2 = false;
for(int j = 0; j <array.length ; j++)
{
do
{
check = false;
int random = (int)(Math.random() * 5 + 1);
array[j] = random;
if ( j > 0 )
{// check if it is duplicate in single time
for( int i = 0; i < j ; i++)
{
if (array[j] == array[i])
{
check = true;
}
}
}
if ( j == 0 )
{
for(int n = 0 ; n < a ;n++)
{
if ( first[n] == array[j])
{
check = true;
}
}
}
if ( j == 4)
{
for(int n = 0 ; n < a ;n++)
{
if ( last[n] == array[j])
{
check = true;
}
}
}
}while(check);
}
if ( a < 2 )
{
first[a] = array[0];
last[a] = array[array.length-1];
}
for(int j = 0; j <array.length ; j++)
{
System.out.println(array[j]);
}
System.out.println();
}
}
} '
首先,这段代码将随机选择1到5之间的数字,没有重复,它将执行3次,每次第一个数字和最后一个数字都不同。
这是问题所在,而不是使用单词来描述我的问题,我将使用一个例子:
我第一次说:
1 2 3 4 5
因此,第二次,我不能将1作为我的第一个号码,将5作为我的最后一个号码。
2 3 五 4 1
现在,第三次,我不能将1和2作为我的第一个数字,因为1和2是第一次和第二次的第一个数字。我不能将1和5作为我的最后一个数字,因为1和5是第一次和第二次的最后一个数字。有一个问题:
3 1 2 4 ??
最后一个数字不是任何数字,因为5是唯一剩下的最后一个数字,但最后一个数字不能是5,所以do-while循环将继续运行。因此,它从不打印数字。
你可以复制我的代码并运行它3次,你会知道我的意思
如果您不明白我想做什么,请随时提出任何问题,我会尽力回答您的问题:)。也很抱歉英语不好。
答案 0 :(得分:0)
这应该有效。它跟踪数组used
中第一个和最后一个位置使用的数字。如果在第一个位置使用了数字used[FIRST_PLACE][x]
,则x
为真,如果在最后一个位置使用了数字x,则used[LAST_PLACE][x]
为真。
在for循环中,一维数组alreadyUsedInRow
会跟踪当前行中使用的数字。如果已在当前行中使用了数字alreadyUsedInRow[x]
,则x
为真。
在每一行中,算法首先选择第一个和最后一个数字,因为它们对其选择的约束最多。然后选择第2,第3和第4个数字。
import java.util.Random;
public class Rand15 {
public static final int FIRST_PLACE = 0;
public static final int LAST_PLACE = 1;
public static void main(String[] args)
{
Random r = new Random();
boolean [][] used = new boolean [2][5];
// Do this three times
for (int i = 0; i < 3; i++ ) {
// Keep track of numbers used in current iteration
boolean [] alreadyUsedInRow = new boolean [5];
int [] candidate = new int [5];
// Get the first place
candidate[0] = r.nextInt(5);
// If this number has been already used in first place
while (used[FIRST_PLACE][candidate[0]]) {
// Get another number
candidate[0] = r.nextInt(5);
}
// Set first place used to true for this number
used[FIRST_PLACE][candidate[0]] = true;
// This number has already been used for current row
alreadyUsedInRow[candidate[0]] = true;
// Get last place for this row
candidate[4] = r.nextInt(5);
// If this number hasalready been used in last place try again
while (used[LAST_PLACE][candidate[4]] || alreadyUsedInRow[candidate[4]] ) {
candidate[4] = r.nextInt(5);
}
used[LAST_PLACE][candidate[4]] = true;
alreadyUsedInRow[candidate[4]] = true;
// Get 2nd place
candidate[1] = r.nextInt(5);
while (alreadyUsedInRow[candidate[1]]) {
candidate[1] = r.nextInt(5);
}
alreadyUsedInRow[candidate[1]] = true;
// Get 3rd place
candidate[2] = r.nextInt(5);
while (alreadyUsedInRow[candidate[2]]) {
candidate[2] = r.nextInt(5);
}
alreadyUsedInRow[candidate[2]] = true;
// Get 4th place
candidate[3] = r.nextInt(5);
while (alreadyUsedInRow[candidate[3]]) {
candidate[3] = r.nextInt(5);
}
alreadyUsedInRow[candidate[3]] = true;
System.out.print(candidate[0]+1);
System.out.print(candidate[1]+1);
System.out.print(candidate[2]+1);
System.out.print(candidate[3]+1);
System.out.println(candidate[4]+1);
}
}
}
3次运行的示例输出:
45123
51432
13425
13245
45123
34152
24531
52134
15243