数独

对着背影说爱祢 提交于 2019-12-21 23:36:01

思想:暴力,递归,DFS,回溯。填一个数字后检测是否满足条件,不满足就回溯。

#include <iostream>
#include <time.h>
using namespace std;

int S[9][9];
int Check(int Sum)
{
    int row=Sum/9,col=Sum%9;
    int row2=row/3*3;
    int col2=col/3*3;
    int i=0,j=0,m=0,n=0;
    
    for(i=0;i<9;i++)//行检查
        if(S[row][i]==S[row][col] && col!=i)
            return 1;
    for(j=0;j<9;j++)//检查列
        if(S[j][col]==S[row][col] && row!=j)
            return 1;
    for(m=row2;m<row2+3;m++)//检查所在的九宫格
    {
        for(n=col2;n<col2+3;n++)
            if(S[row][col]==S[m][n]&&row!=m&&col!=m) return 1;
    }
    return 0;
}

int SD(int Sum)
{
    int row=Sum/9,col=Sum%9;
    int flag=0;
    if(Sum>80)
    {
        printf("\\nanswer:\\n");
        for(int i=0;i<9;i++)
        {
            
            for(int j=0;j<9;j++)
                printf("%d ",S[i][j]);
            printf("\\n");
        }
        return 1;
    }
   
    if(S[row][col]==0)  //没有数字
    {
        for (int i=1; i<10; i++)    //暴力
        {
            S[row][col]=i;
            if(!Check(Sum))
            {
                flag=SD(Sum+1);     //满足三个条件就递归下一格
                if (flag) return 1;     //递归返回

            }
            S[row][col]=0;      //注意:回溯后面的数据是要变为零的
        }
    }
    else        //有数字
    {
        flag=SD(Sum+1);         //
        if (flag) return 1;
    }
    return 0;
}

int main()
{
    clock_t Star,End;
    Star=clock();
    printf("请输入题目,空白用0代替:\\n");
    for(int i=0;i<9;i++)
        for(int j=0;j<9;j++)
            scanf("%d",&S[i][j]);
    SD(0);
    End=clock();
    double Time=(double)(End-Star)/CLOCKS_PER_SEC;
    printf("用时:%f秒\\n",Time);
    
    return 0;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!