簡體   English   中英

用C生成數獨板

[英]Generating a Sudoku Board in C

嗨,大家好,我為C類分配了一個作業,我需要其中一個功能的幫助。

例如,

void genSudokuBoard(int grid[ ], int display[ ])

此函數使用81元素“網格”數組(包含有效數獨值的完整列表),並將每個3x3塊中的4個數字隨機復制到81元素“顯示”數組中的相應位置。 所選擇的隨機數將取決於數組位置(索引),因此,例如,假設左上方的3x3塊由數組索引組成:整個3x3塊:0、1、2、9、10、11、18、19, 20 4個隨機索引可能是:2、10、11、19

到目前為止,我有這個

void genSudokuBoard(int grid[], int display[])
{
   int i;

   for (i = 0; i < 81; i++){
      display[i] = grid[rand() % 9 + 1];
   }
}

基本上我的問題是,如何將每個3x3塊中的4個隨機數復制到display []數組中的相應位置?

由於這是一項家庭作業,因此我將給您一些提示,而不是解決方案。

display[i] = grid[rand() % 9 + 1];

在這里,您從隨機網格索引復制到display[i] 這絕對不是您想要的。 復制時,您需要復制到相同的索引。

display[i] = grid[i];

你只需要選擇哪個i復制和女巫沒有。

您需要從9個數字中生成4個隨機數。 例如,在您的示例中,您必須確定構成網格的9個索引: 0, 1, 2, 9, 10, 11, 18, 19, 20 那是一組9個值,因此您可以生成4個不同的索引0 <= r <9。 您只能從4個生成的索引中提取該集合。 因此,如果生成0 1 4 5 ,則取0 1 10 11 然后,繼續復制display[i] = grid[i] ,其中i0 1 10 11

當然,還有其他方法。

我的建議是自下而上解決這個問題。 一旦確定了算法(就像我給你的算法一樣),就應該嘗試解決一些小問題。 例如,您首先應該弄清楚如何生成構成網格的9個索引。 與此無關,您應該弄清楚如何在一個間隔中生成k個不同的數字。 您可以在封閉的單元中完成所有這些操作,而完全忽略了其余的問題。 然后,您可以將這些合並到您的最終問題中。

首先,我建議使用二維數組(考慮數獨板是二維的),然后使用嵌套循環填充這些板。 同樣,您將需要使用范圍(0-2),(3-5)和(6-8)作為指導,哪些塊組成哪些區域。 在此,每個塊是一個3x3區域,並且在每個區域中是x和y的索引集(假設原點是左上角)。 此圖顯示了哪些區域

只需在這些區域中隨機選擇數字即可。 該算法不應該太棘手

附錄:display []不是函數; 這是一個數組

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM