• 华为2016研发工程师编程题 数独


    题目: 

      数独是一个我们都非常熟悉的经典游戏,运用计算机我们可以很快地解开数独难题,现在有一些简单的数独题目,请编写一个程序求解。

    输入描述: 

      输入9行,每行为空格隔开的9个数字,为0的地方就是需要填充的。

    输出描述: 

      输出九行,每行九个空格隔开的数字,为解出的答案。

    参考答案

    #include <iostream>
    
    using namespace std;
    
    /*
    0 0 0 0 0 2 0 5 0
    0 7 8 0 0 0 3 0 0
    0 0 0 0 0 4 0 0 0
    5 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 1 0 0
    0 0 0 0 3 0 7 0 8
    2 0 0 0 0 0 0 4 0
    0 0 0 0 0 5 0 9 0
    0 1 0 0 7 0 0 0 0
    */
    
    int nums[9][9];
    bool sign = false;
    
    // 读取输入
    void input() {
        char temp[9][9];
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                cin >> temp[i][j];
                nums[i][j] = temp[i][j] - '0';
            }
        }
    }
    
    bool check(int n, int k) {
        //检查所在行是否合法
        for (int i = 0; i < 9; i++) {
            int j = n / 9;
            if (nums[j][i] == k) return false;
        }
    
        //判断所在列是否合法
        for (int i = 0; i < 9; i++) {
            int j = n % 9;
            if (nums[i][j] == k) return false;
        }
    
        //判断n所在小九宫格是否合法
        int x = n / 9 / 3 * 3;
        int y = n % 9 / 3 * 3;
        for (int i = x; i < x + 3; i++) {
            for (int j = y; j < y + 3; j++) {
                if (nums[i][j] == k) return false;
            }
        }
    
        //全部合法
        return true;
    }
    
    void DFS(int n) {
        if (n > 80) {
            sign = true;
            return;
        }
        if (nums[n / 9][n % 9] != 0) {
            DFS(n + 1);
        }
        for (int i = 1; i <= 9; i++) {
            if (check(n, i)) {
                nums[n / 9][n % 9] = i;
                DFS(n + 1);
                if (sign == true) {
                    return;
                }
                else {
                    nums[n / 9][n % 9] = 0;
                }
    
            }
        }
    }
    
    int main()
    {
        input();
        DFS(0);
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                cout << nums[i][j] <<" ";
            }
            cout << endl;
        }
        return 0;
    }
  • 相关阅读:
    OpenCV on Mac OSX: A step-by-step guide
    opencv打开摄像头获取视频程序
    使用find_if算法搜寻map的value
    c++如何理解map对象的value_type是pair类型
    关联容器执行器指定排序规则
    仿函数和函数配接器
    C++的异常处理
    back_insert_iterator和insert_iterator
    copy函数与ostream_iterator、reverse_iterator
    const_cast
  • 原文地址:https://www.cnblogs.com/skyeisgood/p/12509948.html
Copyright © 2020-2023  润新知