这个问题已经在这里有一个答案:
- 如何生成独特的解决方案的数独板 9个回答
有多少可能的独特的方式,在那里产生一个数独谜题? 我能想到的只有两种可能的方式1)取一个解决数独谜题和洗牌的行和列2)生成一个随机数,并检查它是否违反了任何的数独的限制,重复直到数量不违反任何数独约束为每平方米(理论上可能的,但通常它会导致死锁)
是否有其他方法吗?
这个问题已经在这里有一个答案:
有多少可能的独特的方式,在那里产生一个数独谜题? 我能想到的只有两种可能的方式1)取一个解决数独谜题和洗牌的行和列2)生成一个随机数,并检查它是否违反了任何的数独的限制,重复直到数量不违反任何数独约束为每平方米(理论上可能的,但通常它会导致死锁)
是否有其他方法吗?
这是一个20页的PDF,标题为“数独游戏生成:从易到邪恶”,那你可能会发现在你的追求是有用的。
要回答你的问题:
是否有其他方法吗?
是。 是有。
简单的方法来产生高达采取解决Sudoko难题,步骤1)与I替换所有1与A,2与乙直到9,步骤2)做在使用的每个水平和垂直块块1和3之间的随机洗牌,在这里每个只能有3种可能的组合。 步骤3)现在洗牌块只能有3个垂直和3个水平洗牌步骤4)旋转块1〜4时间..步骤5)垂直镜像难题和水平使用1和步骤6之间2.随机)替换所有A与任何数量的1至9 ..
猜测这将产生约38093690880连击....
这会工作。
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;
}