天天看点

一个数独的暴力搜索通用程序——brute force search for SouKou

int fixed[9][9];
void PRINT(int sudu[],int i,int j)
{
    for(int i=0;i<9;i++)
    {
        for(int j=0;j<9;j++)
        {
            printf("%2d,",sudu[i*9+j]);
        }
        printf("\n");
    }
}
void tryNext(int sudu[],int i,int j)
{
    //if(valid)
       int num=1; 
       bool valid=true;
       if(fixed[i][j])
       {
           if(j>=8)
           {
               if(i==8)
               {
                   PRINT(sudu,i,j);
               }
               else 
                   tryNext(sudu,i+1,0);
           }
           else
            tryNext(sudu,i,j+1);
           return;
       }

   for( num=1;num<=9;num++)
   {
       //行是否冲突
       int k=0;
       for(;k<9;k++)
       {
           if(sudu[i*9+k]==num)
           {
               goto NEXT;
           }
       }
       //列是否冲突
       for(k=0;k<9;k++)
       {
           if(sudu[k*9+j]==num){
               goto NEXT;
           }
       }
       //小矩形是否冲突
        int h = i/3;
        int l = j/3;

        for(int m=0;m<3;m++)
        {
            for(int n=0;n<3;n++)
            if(sudu[(h*3+m)*9+(l*3)+n]==num ){
                    goto NEXT;
            }
        }

        if(valid)
        {
            //都不冲突
            sudu[i*9+j]=num;
            if(j>=8)
            {
                if(i==8)
                {
                    PRINT(sudu,i,j);
                }
                else {
                     tryNext(sudu,i+1,0);
                }
            }
            else
                tryNext(sudu,i,j+1);
        }
NEXT:;
   }
   sudu[i*9+j]=0;
 }

int main(int argc,char*argv[])
{
    int sudu[9][9]={
 8,+0,+0,+0,+0,+0,+0,+0,+0,
+0,+0, 3, 6,+0,+0,+0,+0,+0,
+0, 7,+0,+0, 9,+0, 2,+0,+0,
+0, 5,+0,+0,+0, 7,+0,+0,+0,
+0,+0,+0,+0, 4, 5, 7,+0,+0,
+0,+0,+0, 1,+0,+0,+0, 3,+0,
+0,+0, 1,+0,+0,+0,+0, 6, 8,
+0,+0, 8, 5,+0,+0,+0, 1,+0,
+0, 9,+0,+0,+0,+0, 4,+0,+0,
    };

    for(int i=0;i<9;i++)
    {
        for(int j=0;j<9;j++)
        {
            if(sudu[i][j]!=0)
                fixed[i][j] = 1;
        }
    }
    tryNext(&sudu[0][0],0,0);
    return 0;
}
           

 这个不管什么样的初始化,全都重新搜索一遍,会搜索所有可能的结果,而不是搜索到结果后就停止的那种,暴力法。