2011-05-17 62 views
1

我有一个2D整数数组,5x5的,我已经提出,随机地生成的数字1 - 5在每个阵列单元的:随机产生一个唯一的数字网格

public int[,] generateGrid() 
{ 
    int seed = DateTime.Now.Second; // generate seed 
    Random rand = new Random(seed); // initialise random number with seed 

    int[,] grid = new int[_gridSize, _gridSize]; // create 2D array for grid 

    for (int i = 0; i < _gridSize; i++) // loop through rows 
    { 
     for (int j = 0; j < _gridSize; j++) // loop throug columns 
     { 
      int value = 0; // initialise the value to be entered into cell 

      while (value == 0) // while value is invalid ("0") keep generating new number 
      { 
       value = rand.Next() % _gridSize + 1; // generate value from 0 - gridsize 
       grid[i, j] = value; // input value. Note: if value = 0, the loop will regenerate a new value 
      } 

     } 
    } 
    return grid; 
} 

现在这个代码这是工作。 (不知道效率 - 任何额外的效率建议将有所帮助。)

但我的问题是,每列和每一行只能包含数字1-5 一次! (而不是像Sudoku),我不知道如何做到这一点(或者做到这一点的最佳方式)。

我的第一个想法是创建一个堆栈,并推动堆栈中每行创建的所有值,然后检查它是否已包含该值。如果是的话,生成一个新的值,再等 检查,但迭代堆栈是一个坏主意,还,这是很好的检查行,但是当它涉及到检查列的唯一性,它变得有点困难!

所以基本上,我怎样才能让所有的行和列都是唯一的,但每次都能随机生成。什么是最好的方法来做到这一点?

+0

和问题是什么? – ColWhi 2011-05-17 13:43:08

+0

和你的问题是...? – Syjin 2011-05-17 13:43:11

+0

什么问题? – Marcelo 2011-05-17 13:43:33

回答

1

我发现一个解决方案,我愿意发布任何其他人在这篇文章中寻找答案的绊脚石。要生成一个唯一的号码格的N×N(虽然我只测试了5×5), 下面的代码应该做的伎俩:

//下面是在C#

public int[,] generateGrid() // POSSIBLE UPDATE:: WHEN RESETING GRID ROW, REMEMBER PREVIOUS ORDER TO AVOID SAME COMFLICTION TWICE 
{ 
    Random rand = new Random(); 
    ArrayList availableColumnNumbers = new ArrayList(); 
    ArrayList availableRowNumbers = new ArrayList(); 
    ArrayList availableNumbers = new ArrayList(); 
    int[,] grid = new int[_gridSize, _gridSize]; 

    availableColumnNumbers = resetArrayList(); // create a list that holds the numbers 1 - Grid Size 
    availableRowNumbers = resetArrayList(); // create a list that holds the numbers 1 - Grid Size 

    for (int row = 0; row < _gridSize; row++) // loop through rows 
    { 
     for (int column = 0; column < _gridSize; column++) // loop through columns 
     { 
      if (row == 0) // if row to be filled if the first row 
      { 
       int position = rand.Next(availableRowNumbers.Count); // Generate a random position 
       grid[row, column] = (int)availableRowNumbers[position]; // place available row numbers 
       availableRowNumbers.RemoveAt(position); // update available row numbers 
      } 
      else // row to be filled has constraints. Fill in, taking constraints into consideration 
      { 
       // update available column number, finds out what values are already in the column, and generates the only available values 
       availableColumnNumbers = getAvailableColumnNumbers(grid, column); 
       // combine available Rows and Columns to get a list of available numbers for that cell 
       availableNumbers = getSimilarNumbers(availableRowNumbers, availableColumnNumbers); 

       if (availableNumbers.Count != 0) // if there are available numbers to place, 
       { 
        int position = rand.Next(availableNumbers.Count); 
        grid[row, column] = (int)availableNumbers[position]; // place available number 
        availableRowNumbers.Remove((int)availableNumbers[position]); // update available row numbers 
       } 
       else // Confliction: There are no available numbers (restart entire row) 
       { 
        grid = resetRow(grid, row); // reset the entire row where confliction occured 
        column = -1; // start again at begining of column 
        availableRowNumbers = resetArrayList(); // reset Array List 
       } 
      } 
     } 
     availableRowNumbers = resetArrayList();// reset available row array 
    } 
    return grid; 

该解决方案带来了一些函数来源不张贴...但他们是非常直接的任何狂热的开发人员找出:)

快乐编码!

亚历

0

我猜你可能要做到这一点有点像解决数独。换句话说,最初每个单元格可以包含5个值中的任何一个:因此您可以随意设置第一个单元格,而没有任何限制。然后设置下一个单元格:现在是有限制的,它不能有第一个单元格(这是在同一行中)的值,所以你可能需要花几分钟去得到一个有效的数字。

只是沿着每一行和每列继续工作,总是检查回到左边(下方列索引)查找已在此行上设置的值,并检查(下方行索引)此列上已设置的值。如果您尝试将单元格设置为已在此行或列上使用的值,请再试一次。

如果您需要使用不同大小的网格,这应该是可扩展的。我将它留给你,如果需要如何优化它(提示:在设置最后一个单元格可能最终采取比其他电池更长,即使是只有一个可能值之一)。

0

我不认为你需要关心这样一个小电网的效率(甚至没有更大的电网)。

最简单的解决方案是通过简单地迭代网格来检查当前行和列中您要写入该单元格的值。