Github项目地址
一看到题目后,整个看完了,一开始是先生成一个数独(填了一些空的),后来发现只要直接生成数独就好了,然后就想着用随机数做,然后行列宫比较,回溯。感觉应该不难,就不着急做,结果高估自己了,不知道卡在哪了,(其实就是循环出不来)然后又到了要交作业的时间了,好吧,就换个能出结果的吧,虽然知道数独个数很少。行列宫比较肯定还是一样的,改成第一行随机,接下去就是1-9顺序取值进行行列宫比较,因为是顺序所以导致数独重复概率大。感觉这次作业最大的收获就是态度要端正,可能是还沉浸在暑假里不想自拔吧,回想一下自己第一次作业的深度的自我解剖,真是深感惭愧,虽然作业就要提交了,但并不妨碍自己思考这道题,以后要好好对待软工了。
两个函数,start函数初始化数独,get_Initial_State函数用来搜索、确定填入的值,以及是否回溯。,初始化后再搜索,即先start再get_Initial_State。
··· b=rand() % 9 + 1;
if(a[b]!=0)
{
Initial_State[1][c] =a[b];
a[b]=0;
}//第一列数据随机生成
for( int m = 1 ; m < i ; ++m )
if( Initial_State[m][j] == k ) // 检查同一列是否出现过数字k
{
can = false ;
break ;
}
if ( can )
for( int n = 1 ; n < j ; ++n )
if( Initial_State[i][n] == k ) // 检查同一行是否出现过数字k
{
can = false ;
break;
}
for( int p = up1-2 ; p <= up1 ; ++p ) /* 检查在3×3的小方格中是否出现了同一个数字 */
{
if( can == false ) /* 跳出外层循环 */
break ;
for( int q = up2-2 ; q <= up2 ; ++q )
if( Initial_State[p][q] == k )
{
can = false ;
break ;
}
}
if( can )
{
Initial_State[i][j] = k ;
if( j<9 )
{
if( get_Initial_State( i , j +1 ) ) /* 到同一行的下一位置开始搜索 */
return true ;
}
else
{
if( i < 9 )
{
if( get_Initial_State( i + 1 , 1 ) ) /* 到下一行的第一个空格开始搜索 */
return true ;
}
else
return true ; /* i >= 9 && j >= 9 , 搜索结束 */
}
Initial_State[i][j] = 0 ; /* 关键这一步:找不到解就要回复原状,否则会对下面的搜索造成影响 */
}···