美文网首页C++
C++解数独

C++解数独

作者: blackOak | 来源:发表于2017-12-22 20:55 被阅读0次

    大概是把网上找到的代码稍微改了一下,记不清了= =

    代码

    #include <iostream>
    
    using namespace std;
    
    /* 构造完成标志 */
    bool sign = false;
    
    /* 创建数独矩阵 */
    int num[9][9];
    
    void Input();
    void Output();
    bool Check(int n, int key);
    int  DFS(int n);
    
    int main()
    {
        cout << "请输入一个9*9的数独矩阵,数字用空格隔开,空位以0表示:" << endl;
        Input();
        DFS(0);
        Output();
    }
    
    /* 读入数独矩阵 */
    void Input()
    {
        for (int i = 0; i < 9; i++)
            for (int j = 0; j < 9; j++)
                cin >> num[i][j];
    }
    
    /* 输出数独矩阵 */
    void Output()
    {
        cout << endl;
        for (int i = 0; i < 9; i++)
        {
            for (int j = 0; j < 9; j++)
            {
                cout << num[i][j] << " ";
                if (j % 3 == 2)
                    cout << "   ";
            }
            cout << endl;
            if (i % 3 == 2)
                cout << endl;
        }
    }
    
    /* 判断key填入n时是否满足条件 */
    bool Check(int n, int key)
    {
        /* 判断n所在横列是否合法 */
        for (int i = 0; i < 9; i++)
        {
            /* j为n竖坐标 */
            int j = n / 9;
            if (num[j][i] == key) return false;
        }
    
        /* 判断n所在竖列是否合法 */
        for (int i = 0; i < 9; i++)
        {
            /* j为n横坐标 */
            int j = n % 9;
            if (num[i][j] == key) return false;
        }
    
        /* x为n所在的小九宫格左顶点竖坐标 */
        int x = n / 9 / 3 * 3;
    
        /* y为n所在的小九宫格左顶点横坐标 */
        int y = n % 9 / 3 * 3;
    
        /* 判断n所在的小九宫格是否合法 */
        for (int i = x; i < x + 3; i++)
            for (int j = y; j < y + 3; j++)
                if (num[i][j] == key) return false;
    
        /* 全部合法,返回正确 */
        return true;
    }
    
    /* 深搜构造数独 */
    int DFS(int n)
    {
        /* 所有的都符合,退出递归 */
        if (n > 80)
        {
            sign = true;
            return 0;
        }
        /* 当前位不为空时跳过 */
        if (num[n/9][n%9] != 0)
            DFS(n+1);
        else
            /* 否则对当前位进行枚举测试 */
            for (int i = 1; i <= 9; i++)
                /* 满足条件时填入数字 */
                if (Check(n, i) == true)
                {
                    num[n/9][n%9] = i;
                    /* 继续搜索 */
                    DFS(n+1);
                    /* 返回时如果构造成功,则直接退出 */
                    if (sign == true) return 0;
                }
    }
    

    测试用例

    1 0 3 0 0 0 5 0 9
    0 0 2 1 0 9 4 0 0
    0 0 0 7 0 4 0 0 0
    3 0 0 5 0 2 0 0 6
    0 6 0 0 0 0 0 5 0
    7 0 0 8 0 3 0 0 4
    0 0 0 4 0 1 0 0 0
    0 0 9 2 0 5 8 0 0
    8 0 4 0 0 0 1 0 7

    相关文章

      网友评论

        本文标题:C++解数独

        本文链接:https://www.haomeiwen.com/subject/chwxgxtx.html