牛客网--数独

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

输入描述:

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

输出描述:

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

思路 

参考了答案解析

从三个方面来判断缺失位置的数字,分别是缺失位置对应的行,缺失位置对应的列和缺失位置对应的块;

缺失位置的数值从1到9,一个一个地尝试

#include<bits/stdc++.h>
using namespace std;
bool contain(vector<int>& vec, int k) {
    int size = vec.size();
    for (int i = 0; i < size; ++i)
        if (vec[i] == k)
            return true;
    return false;
}
bool dfs(vector<vector<int> >& matrix, vector<vector<int> >& row, vector<vector<int> >& col, vector<vector<int> >& squ, int index) {
    if (index == 81) return true;
    int i = index / 9;
    int j = index % 9;

    if (matrix[i][j])
        return dfs(matrix, row, col, squ, index + 1);
    else {
        for (int k = 1; k <= 9; ++k) {
            if (!contain(row[i], k) && !contain(col[j], k) && !contain(squ[i / 3 * 3 + j / 3], k)) {
                matrix[i][j] = k;
                row[i].push_back(k);
                col[j].push_back(k);
                squ[i / 3 * 3 + j / 3].push_back(k);
                if (dfs(matrix, row, col, squ, index + 1))
                    return true;
                matrix[i][j] = 0;
                row[i].erase(row[i].begin() + row[i].size() - 1);
                col[j].erase(col[j].begin() + col[j].size() - 1);
                squ[i / 3 * 3 + j / 3].erase(squ[i / 3 * 3 + j / 3].begin() + squ[i / 3 * 3 + j / 3].size() - 1);

            }
        }
        return false;
    }
}
int main() {
    vector<vector<int> > matrix(9, vector<int>(9, 0));
    vector<vector<int> > row(9);
    vector<vector<int> > col(9);
    vector<vector<int> > squ(9);

    char ch;
    for (int i = 0, j = 0; i < 9; ) {
        cin >> ch;
        if (ch == '}') {
            ++i, j = 0;
            continue;
        }
        if (isdigit(ch)) {
            int num = int(ch - '0');
            matrix[i][j] = num;
            if (num) {
                row[i].push_back(num);
                col[j].push_back(num);
                squ[i / 3 * 3 + j / 3].push_back(num);
            }
            j++;
        }
    }

    dfs(matrix, row, col, squ, 0);

    for (int i = 0; i < 9; ++i) {
        cout << "{";
        for (int j = 0; j < 9; ++j) {
            if (j != 8)
                cout << matrix[i][j] << ",";
            else
                cout << matrix[i][j];
        }

        cout << "}" << endl;
    }
    return 0;
}

发布了208 篇原创文章 · 获赞 28 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/weixin_41879093/article/details/105397865