题解 | #Sudoku#

Sudoku

https://www.nowcoder.com/practice/78a1a4ebe8a34c93aac006c44f6bf8a1

#include <iostream>
#include <vector>
#include <set>
using namespace std;

typedef struct pos_t {
    int x;
    int y;
} pos;

class Sudoku {
  public:
    Sudoku(const vector<vector<int>>& sudoku): m_sudoku(sudoku) {
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                if (m_sudoku[i][j] == 0) {
                    m_null_pos.push_back({i, j});
                }
            }
        }
        // cout<<m_null_pos.size()<<endl;
    }

    bool check_is_valid(pos current_pos, int val) {
        //3x3
        int current_3x3_pos_x = current_pos.x / 3 * 3;
        int current_3x3_pos_y = current_pos.y / 3 * 3;
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                if (m_sudoku[i + current_3x3_pos_x][j + current_3x3_pos_y] == val) {
                    return false;
                }
            }
        }

        //row
        for (int i = 0; i < 9; i++) {
            if (m_sudoku[current_pos.x][i] == val) {
                return false;
            }
        }

        //colomn
        for (int i = 0; i < 9; i++) {
            if (m_sudoku[i][current_pos.y] == val) {
                return false;
            }
        }
        return true;
    }

    int do_sudoku(int null_pos) {
        // cout<<"null_pos: "<<null_pos<<endl;
        if (null_pos >= m_null_pos.size()) {
            return 0;
        }

        int ret = 0;
        bool flag = false;
        pos current_pos = m_null_pos[null_pos];
        // cout<<"null_pos: "<<null_pos<<endl;
        int next_pos = null_pos + 1;
        for (int i = 1; i <= 9; i++) {
            // cout<<"    null_pos: "<<null_pos<<", i :"<<i<<endl;
            if (check_is_valid(current_pos, i)) {
                m_sudoku[current_pos.x][current_pos.y] = i;
                ret = do_sudoku(next_pos);
                // cout <<"        pos: "<<null_pos<<", "<< "current pos: "<<current_pos.x<<", "<<current_pos.y<<", val: "<<i<<", ret: "<<ret<<endl;
                if (ret == 0) {
                    flag = true;
                    break;
                }
            }
        }

        if (flag) {
            return 0;
        } else {
            m_sudoku[current_pos.x][current_pos.y] = 0;

            return -1;
        }

    }

    const vector<vector<int>>& get_sudoku() {
        return m_sudoku;
    }

  private:
    vector<vector<int>> m_sudoku;
    vector<pos> m_null_pos;
};

int main() {
    vector<vector<int>> sudoku(9, vector<int>(9));

    for (int i = 0; i < 9; i++) {
        for (int j = 0; j < 9; j++) {
            cin >> sudoku[i][j];
        }
    }

    Sudoku object(sudoku);
    int ret = object.do_sudoku(0);
    sudoku = object.get_sudoku();
    for (int i = 0; i < 9; i++) {
        for (int j = 0; j < 9; j++) {
            cout << sudoku[i][j] << " ";
        }
        cout << endl;
    }
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务