生成數獨終局
本次個人項目是要求生成1e6個數獨終局。
首先說說數獨的規則,數獨的棋盤是一個9×9的格圖,每3×3又是一個9宮格。
數獨的要求是每行、每列、每個9宮格中,1~9這9個數字必須出現且僅出現一次。
對於每一個數獨終局,我們只需把所有的一換成而或者其他的數字,就會生成一個新的數獨終局,那麽就有了9!種,但是要求中左上角的數字是不能動的,所以一個全新的數獨“種子”通過8的全排列之後就能產生8!個數獨終局,所以我們只需找到25個“種子”再通過數字變換即可得到1e6個數獨終局。
下面是我的代碼部分實現:
for(k=0;k<9;k++)
{
for(x=0;x<9;x++)
{
for(int j=1;j<9;j++)
{
if(shudu[temp][k][x]==j)
{
output[k][x]=str[i][j];
}
}
}
}
for(a=0;a<9;a++)
{
for(b=0;b<8;b++)
{
printf("%d ",output[a][b]);
}
printf("%d\n",output[a][8]);
}
printf("\n");
}
temp++;
if(temp*40320>N-1)
return 0;
因為沒有直接運算,而是調換順序來生成新的終局,所以效率很不錯。
歡迎各位dalao指點。
生成數獨終局