• [Problem 1]解答


    #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();
        system("pause");
    }
     
    /* 读入数独矩阵 */
    void Input()
    {
        char temp[9][9];
        for (int i = 0; i < 9; i++)
        {
            for (int j = 0; j < 9; j++)
            {
                cin >> temp[i][j];
                num[i][j] = temp[i][j] - '0';
            }
        }
    }
     
    /* 输出数独矩阵 */
    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;
                    /* 如果构造不成功,还原当前位 */
                    num[n/9][n%9] = 0;
                }
            }
        }
    }
    

      

  • 相关阅读:
    linux下分析Java程序内存汇总
    Linux使用jstat命令查看jvm的GC情况
    linux的top命令参数详解
    项目中常用的19条MySQL优化
    MySQL:(一)
    MySQL:(二)
    微信公众号开发 (3) 菜单处理
    MyBatis项目实战 快速将MySQL转换成Oracle语句
    Spring Boot (5) 整合 RabbitMQ
    系统 (一) Windows10安装Ubuntu子系统
  • 原文地址:https://www.cnblogs.com/TonyNeal/p/problem1answer.html
Copyright © 2020-2023  润新知