2012-12-12 9 views
8

数独パズルを生成する方法はいくつありますか? 私は2つの可能な方法しか考えられません 1)解決済みの数独パズルを取り、行と列をシャッフルします 2)乱数を生成して数独制約に違反していないかどうかを確認し、数がすべての数独制約に違反しなくなるまで繰り返します正方形(理論的には可能ですが、通常はデッドロックにつながります)独創的な方法でスードクパズルを生成する

他の方法はありますか?

答えて

21

Hereは20ページのPDFで、「簡単なものから悪いものまで」というタイトルのPDFで、おそらくあなたのクエストに役立つでしょう。あなたの質問に答えるために

は、他の方法はありますか?

はい。はい、あります。

-2

これは機能します。 、 ステップ1を解決Sudokoパズルを取るまで生成する

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; 

}

-2

簡単な方法)I、 ステップ2で9までBをA、2とすべて1を置き換える)でシャッフルを行います1と3の間のランダムを使用する各水平および垂直ブロックブロックは、ここではそれぞれ3つの可能な組み合わせしか存在しない。 ステップ3)今度はブロックをシャッフルして、垂直シャープル3回、水平シャッフルシャッフル ステップ4)ブロック1〜4回を回転させます。 ステップ5)1と2の間のランダムを使用してパズルを垂直方向と水平方向にミラーリングします。 ステップ6)すべてのAを任意の1〜9の数字に置き換えます。

これは約38,093,690,880のコンボを生成すると推測します。

関連する問題