[Leetcode] Sudoku Solver

来源:互联网 发布:java for循环语句 编辑:程序博客网 时间:2024/04/25 23:15

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...


...and its solution numbers marked in red.

回溯!

我的代码有一个弊病,每次回溯都从 board[0][0] 开始搜,浪费时间。解决方案是设计一个position struct (包含x,y坐标),将所有的 empty position 放入一个 vector,再一个一个处理。(类似 DFS 的说)但是,我还是太懒了,唔~

class Solution {public:    void solveSudoku(vector<vector<char> > &board)    {        solveThisSudoku(board);            }         bool solveThisSudoku(vector<vector<char> > &board) {        // Start typing your C/C++ solution below        // DO NOT write int main() function        bool forward = false;        for(int i=0;i<9;i++)        {            for(int j=0;j<9;j++)            {                if(board[i][j]=='.')                {                    for(int val=1;val<=9;val++)                    {                        board[i][j] = '0' + val;                        if( checkSudoku(board,i,j) && solveThisSudoku(board)== true )                        {                            return true;                                                    }                        board[i][j] = '.';                    }                    return false;                 }                            }        }        return true;            }        bool checkSudoku(vector<vector<char> >& board, int x, int y)    {            bool flags[9] = {0};for(int i = 0; i < 9; ++i)if(board[x][i] >= '1' && board[x][i] <= '9'){if(!flags[board[x][i] - '1'])flags[board[x][i] - '1'] = true;elsereturn false;}memset(flags, 0, 9);for(int i = 0; i < 9; ++i)if(board[i][y] >= '1' && board[i][y] <= '9'){if(!flags[board[i][y] - '1'])flags[board[i][y] - '1'] = true;elsereturn false;}int xx = x/3*3;int yy = y/3*3;memset(flags, 0, 9);for(int i = 0; i < 3; ++i)for(int j = 0; j < 3; ++j)if(board[xx+i][yy+j] >= '1' && board[xx+i][yy+j] <= '9'){if(!flags[board[xx+i][yy+j]-'1'])flags[board[xx+i][yy+j]-'1'] = true;elsereturn false;}return true;}};



原创粉丝点击