Sudoku Solver

Write a program to solve a Sudoku puzzle by filling the empty cells.

Empty cells are indicated by the character '.'.

You may assume that there will be only one unique solution.

A sudoku puzzle...

 

 

 

class Solution {
public:
    //检查当前位置的值是否符合要求
    bool check(vector<vector<char>>& board, int row, int col) {
        int n = board.size();
        int i, j;
        int tmp = board[row][col];
        //判断这一行
        for (i=0; i<n; i++) {
            if (i == row) {
                continue;
            }
            if (board[i][col] == tmp) {
                return false;
            }
        }

        //判断这一列
        for (i=0; i<n; i++) {
            if (i == col) {
                continue;
            }
            if (board[row][i] == tmp) {
                return false;
            }
        }

        //判断方块
        for (i = row / 3 * 3; i < row / 3 * 3 + 3; i++) {
            for (j = col / 3 * 3; j< col /3 * 3 + 3; j++) {
                if (i == row && j == col) {
                    continue;
                }
                if (board[i][j] == tmp) {
                    return false;
                }
            }
        }

        return true;
    }
    //获取下一个需要填写的位置,如果找到了就返回成功,并修改row 和col, 如果找不到就返回失败
    bool get_next_position(vector<vector<char>>& board, int &row, int &col) {
        int i;
        int j;
        int n = board.size();

        for (j=col; j<n; j++) {
            if (board[row][j] == '.') {
                col = j;
                return true;
            }
        }

        if (row == n - 1) {
            return false;
        }

        for (i=row+1; i < n; i++) {
            for (j=0; j < n; j++) {
                if (board[i][j] == '.') {
                    row = i;
                    col = j;
                    return true;
                }
            }
        }
        return false;
    }
    /*
     * board[i][j]赋值1,如果成功,找下一个空白进行赋值
     * 如果失败,board[i][j]++, 如果board[i][j]为9,仍然失败,对上一个空白进行++
     *
     * */
    bool solve(vector<vector<char>>& board, int i, int j) {
        //给当前位置赋值,如果赋值后检测OK,就找一个位置继续。
        //如果1-9都失败了,就返回失败
        board[i][j] = '1';
        while (board[i][j]<='9') {
            while (!check(board, i, j)) {
                board[i][j]++;
            }
            //如果1-9都check失败,就讲当前位置设置为".",然后将返回上一个位置,并将内容++
            if (board[i][j] == ':') {
                board[i][j] = '.';
                return false;
            }

            int next_i = i;
            int next_j = j;
            //如果找不到下个,说明整个数组都遍历完了
            if (!get_next_position(board, next_i, next_j)) {
                return true;
            }
            if (solve(board, next_i, next_j)) {
                return true;
            } else {
                board[i][j]++;
            }
        }
        board[i][j] = '.';
        return false;
    }

    void solveSudoku(vector<vector<char>>& board) {
        int i = 0;
        int j = 0;
        if (!get_next_position(board, i, j)) {
            return;
        }
        solve(board, i, j);

    }
};

 

posted on 2016-02-07 14:48  walkwalkwalk  阅读(217)  评论(0编辑  收藏  举报

导航