华为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;
}

猜你喜欢

转载自www.cnblogs.com/skyeisgood/p/12509948.html
今日推荐