数独问题

数独问题

数独是根据9*9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫内的数字均含1-9,不重复。每一道合格的数独谜题都有且仅有唯一答案。
这里写图片描述
输出该答案。

#include<stdio.h>
#define N 9

int a[N][N]={0,0,5,3,0,0,0,0,0,
             8,0,0,0,0,0,0,2,0,
             0,7,0,0,1,0,5,0,0,
             4,0,0,0,0,5,3,0,0,
             0,1,0,0,7,0,0,0,6,
             0,0,3,2,0,0,0,8,0,
             0,6,0,5,0,0,0,0,9,
             0,0,4,0,0,0,0,3,0,
             0,0,0,0,0,9,7,0,0};

bool OK(int x,int y)    //传值为 x,y 座标
{
    int i,j;
    int xx,yy;

    xx=x/3*3;
    yy=y/3*3;

    for(i=0;i<9;i++)    //判断一行没有相同元素    如果有,返回false
    {
        if(a[x][y]==a[x][i] && i!=y && a[x][i]!=0)
            return false;
    }

    for(i=0;i<9;i++)    //判断一列没有相同元素    如果有,返回false
    {
        if(a[x][y]==a[i][y] && i!=x && a[i][y]!=0)
            return false;
    }

    for(i=xx;i<xx+3;i++)    //判断小九宫格    如果有,返回false
    {
        for(j=yy;j<yy+3;j++)
            if(i!=x || j!=y)  
            {  
                if(a[i][j]==a[x][y] && a[i][j]!=0)  
                    return false;  
            }
    }

    return true;
}

void backtrack(int t)   //传参数 t 从 181 
{
    int i,j;
    int x,y;

    if(t==81)
    {
        for(i=0;i<N;i++)
        {
            for(j=0;j<N;j++)
                printf("%d ",a[i][j]);
            printf("\n");
        }
        return;
    }

    x=t/9;
    y=t%9;

    if(a[x][y]!=0)
        backtrack(t+1);
    else
    {
        for(i=1;i<10;i++)
        {
            a[x][y]=i;
            if(OK(x,y))
                backtrack(t+1);
            a[x][y]=0;
        }
    }

}

int main()
{
    backtrack(0);
    return 0;
}

/*
思路:
    定义一个9*9的数组,把已知的值填入,未知的赋值为 0 。然后,依次从 (0,0)到(n-1,n-1)填入合适的数字。
    回溯:传值为 t (从 181 ),所以截止条件即为 t=81 ,判断座标 x=t/9y=t%9 。然后要求 每一行和每一列 都不相同进行循环判断。再根据传值判断每个粗线矩形的第一个点的座标(即左上角),xx=x/3*3;,yy=y/3*3。判断每一个小矩形内都不相同。
    可以进行剪枝:当a[x][y]=0时进行剪枝。
*/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章