数独问题

来源:互联网 发布:正则表达式匹配端口号 编辑:程序博客网 时间:2024/05/22 13:09

思路

1 对数独求解,即用回溯穷举法。遍历每一个位置,把1-9填入看是否满足。

2 按行遍历,如果这行满了就到下一行。遇到 . 就试着把1-9合适的填进去。接着便利下一个位置。

3 如何判断填入的数字是否合适。可分三种情况,行 列 宫

代码:

 void solveSudoku(vector<vector<char> > &board) {        if(board.empty() || board.size()!=9 || board[0].size()!=9)            return ;        solveSuDuDFS(board,0,0);        //solveSudokuDFS(board,0,0);    }        bool solveSuDuDFS(vector<vector<char>>& board,int row,int col){        if(row==9)            return true;        if(col>=9)            return solveSuDuDFS(board,row+1,0);  //按行遍历,        if(board[row][col]=='.'){             //遇到。才会去试着填数            for(int i=1;i<=9;i++){                board[row][col]=(char)(i+'0');       //把1-9都试这填入                if(isValidSuDu(board,row,col)){  //如果满足就接着去下一个位置                if(solveSuDuDFS(board,row,col+1))                        return true;                    }                board[row][col]='.';       //不满足的话回溯到上一步            }        }else{            return solveSuDuDFS(board,row,col+1);        }        return false;    }        bool isValidSuDu(vector<vector<char>> &board,int row,int col){        for(int i=0;i<9;i++){            if(row!=i&&board[row][col]==board[i][col]){  //判断 每一列 是否有相同的数字                return false;            }           }        for(int i=0;i<9;i++){            if(col!=i&&board[row][col]==board[row][i])  //判断每一行是否有相同的数字                return false;        }                for(int i=row/3*3;i<row/3*3+3;i++){            for(int j=col/3*3;j<col/3*3+3;j++){                if((row!=i||col!=j)&&board[i][j]==board[row][col])  //判断每一个宫内是否有相同的数字                    return false;            }        }        return true;    }   

延伸:

判断一个数独是否是有效的数独

思路:

用hashset 的 add方法 判重复

代码1 :

   public boolean isValidSudoku(char[][] board) {        // 每一个大循环确定一行,一列,一个九宫格        for (int i = 0; i < 9; i++) {            Set<Character> row = new HashSet<Character>();            Set<Character> col = new HashSet<Character>();            Set<Character> cube = new HashSet<Character>();             for (int j = 0; j < 9; j++) {                // 第i行                if (board[i][j] != '.' && !row.add(board[i][j]))                    return false;                // 第i列                if (board[j][i] != '.' && !col.add(board[j][i]))                    return false;                //                int cubeRow = 3 * (i / 3) + j / 3, cubeCol = 3 * (i % 3) + j % 3;                if (board[cubeRow][cubeCol] != '.' && !cube.add(board[cubeRow][cubeCol]))                    return false;            }        }        return true;    }
代码2

 bool isValidSudoku(vector<vector<char> > &board) {        bool flag=true;        for(int i=0;i<9;i++){            for(int j=0;j<9;j++){                char t=board[i][j];                if(t!='.'){                    flag=isValid(board,i,j,t);                    if(!flag)                        return false;                }            }        }        return flag;    }    bool isValid(vector<vector<char>>& board,int row,int col,char t){        for(int i=0;i<9;i++){            if(i!=row&&board[i][col]==board[row][col])                return false;        }        for(int i=0;i<9;i++){            if(col!=i&&board[row][col]==board[row][i])                return false;        }        for(int i=row/3*3;i<row/3*3+3;i++){            for(int j=col/3*3;j<col/3*3+3;j++){                if((i!=row||j!=col)&&board[i][j]==board[row][col])                    return false;            }        }        return true;    }


原创粉丝点击