2011-05-17 41 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

我不認爲你需要關心這樣一個小電網的效率(甚至沒有更大的電網)。

最簡單的解決方案是通過簡單地迭代網格來檢查當前行和列中您要寫入該單元格的值。