关闭 leetcode_c++:哈希:Suduku_Solver(037)
2016-06-28 14:19
621 查看
题目
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.
算法
O(n!)DFS
(借助网上的讨论)因为题目输入保证有且只有一个解,所以试探每一个格子的时候,只需要考虑当前行、列、矩形框满足条件,满足就进入下一个格子试探,不满足回溯。
注意判断一个格子落入哪个矩形框的设计,前面一题采用了比较trivial的方法!
class Solution { public: bool isValidSudoku(vector<vector<char> > &board,int row,int col){ for(int j=0;j<9;j++) if(j != col && board[row][j] == board[row][col]) return false; for(int i=0;i<9;i++) if(i != row && board[i][col] == board[row][col]) return false; int gridRow = row/3*3, gridCol = col/3*3; for(int i=0;i<3;i++) for(int j=0;j<3;j++) if(gridRow + i != row && gridCol + j != col && board[gridRow + i][gridCol + j] == board[row][col]) return false; return true; } bool solveSudokuSingle(vector<vector<char> > &board){ for(int i=0;i<9;i++) for(int j=0;j<9;j++) if(board[i][j] == '.'){ for(int k=1;k<=9;k++){ board[i][j] = '0' + k; if(isValidSudoku(board,i,j) && solveSudokuSingle(board)) return true; board[i][j] = '.'; } return false; } return true; } void solveSudoku(vector<vector<char> > &board) { solveSudokuSingle(board); } };
相关文章推荐
- C++指针详解
- C语言指针详解
- 使用C++视频播放器库libvlc
- 使用C++视频播放器库libvlc
- 动态规划--01背包问题 C++实现
- 制作C++的动态类库dll
- 制作C++的动态类库dll
- 二叉搜索树(Binary Search Tree)的递归和非递归代码实现(C++)
- 关闭 leetcode_c++:哈希:Valid Sudoku(036)
- 期末课程设计之 c++操作mysql完成机票预订系统(vc 6.0配置mysql环境)
- Bazel C++ 基础[翻译]
- [译]详解C++右值引用
- c++构造函数以及类中变量初始化顺序
- C/C++中static关键字详解
- C语言中的static 详细分析
- C++实现不可被复制的类
- 复数四则运算--类模板实现
- c++中关于指针的比较复杂的定义方式(《c++编程思想》读书笔记)
- C语言中字符串与整型,浮点型之间的转换
- leetcode 1 Two Sum C++