生成数独谜题的独特方法

时间:2012-12-12 03:14:10

标签: algorithm puzzle sudoku

有多少可能的独特方式来生成数独谜? 我只想到两种可能的方式 1)采取解决的数独谜题并洗牌行和列 2)生成一个随机数并检查它是否违反任何数独约束,重复直至数字不违反每个方格的任何数独约束(理论上可行,但通常会导致死锁)

还有其他方法吗?

3 个答案:

答案 0 :(得分:21)

Here是一个长达20页的PDF,名为" Sudoku Puzzles Generating:from Easy to Evil",您可能会觉得在您的任务中有用。

回答你的问题:

  

还有其他方法吗?

是。是的。

答案 1 :(得分:-2)

生成解决Sudoko拼图的简单方法, 步骤1)用A替换所有1,用B替换B到9, 步骤2)使用1和3之间的随机在每个水平和垂直块块中进行随机播放,这里每个只能有3种可能的组合。 步骤3)现在洗牌块只能有3个垂直和3个水平洗牌 步骤4)将块旋转1到4次.. 步骤5)使用1和2之间的随机值垂直和水平地镜像拼图。 步骤6)将所有A替换为任何数字1到9 ..

猜测这会产生大约38,093,690,880个组合......

答案 2 :(得分:-3)

这样可行。

void genSudokuBoard(int grid[ ], int display[ ]){
int i,c, j, rowNum, colNum, blockNum;

for(c=0; c<N*N; c++) {
   blockNum = colNum = 1;
   //rowNum = c / N;
     //colNum = c % N;
     //blockNum = (rowNum / 3) * 3 + (colNum / 3);
     for (j=0; j<N; j++)
     printf("%d", grid[((blockNum/3)*N*3) + (colNum/3)*3 + (j/3)*N + j%3]);
   }


printf("\n");
for(i=0; i<N*N; i++) {  /* displaying all N*N numbers in the 'grid' array */

  if(i%N==0 && i!=0) { /* printing a newline for every multiple of N */
     printf("\n");
  }
  printf("%d ", grid[i]);
}
printf("\n");

return 0;

}