duye

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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 ;   /* 关键这一步:找不到解就要回复原状,否则会对下面的搜索造成影响 */
    }···

图片一

图片二

图片三

posted on 2017-09-10 21:14  duye  阅读(193)  评论(1编辑  收藏  举报