如何修复此代码,以便确保打印3次

时间:2017-02-25 03:41:59

标签: java arrays

抱歉标题不好,因为我不知道这个问题的标题应该是什么

看看我复杂的代码:

`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次,你会知道我的意思

如果您不明白我想做什么,请随时提出任何问题,我会尽力回答您的问题:)。也很抱歉英语不好。

1 个答案:

答案 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