leetcode 37 Sudoku Solver
来源:互联网 发布:python开发过哪些软件? 编辑:程序博客网 时间:2024/06/05 19:21
class Solution {public: typedef vector<vector<char> >::size_type sz; typedef set<char>::iterator Sit; void solveSudoku(vector<vector<char>>& board) { sz size = board.size(); // initialize the flags set<char> tmp; for(int i = 1; i < 10; ++i) { tmp.insert('0' + i); } rflag = vector<set<char> >(size, tmp); cflag = vector<set<char> >(size, tmp); bflag = vector<set<char> >(size, tmp); for (sz i = 0; i < size; ++i) { for (sz j = 0; j < size; ++j) { char ch = board[i][j]; if (ch != '.') { rflag[i].erase(ch); cflag[j].erase(ch); bflag[j / 3 * 3 + i / 3].erase(ch); } } } solve(board, 0); return; }private: // mark every row vector<set<char> > rflag; // mark every column vector<set<char> > cflag; // mark every box vector<set<char> > bflag; bool solve(vector<vector<char>>& board, sz ir) { sz size = board.size(); for (sz i = ir; i < size; ++i) { for (sz j = 0; j < size; ++j){ char ch = board[i][j]; if (ch == '.') { set<char> vals(rflag[i]); for (Sit it = vals.begin(); it != vals.end();) { if (cflag[j].find(*it) == cflag[j].end() || bflag[j / 3 * 3 + i / 3].find(*it) == bflag[j / 3 * 3 + i / 3].end()){ // 取共有元素 vals.erase(*it++); } else ++it; } if (vals.empty()) { return false; } for (Sit it = vals.begin(); it != vals.end(); ++it) { board[i][j] = *it; rflag[i].erase(*it); cflag[j].erase(*it); bflag[j / 3 * 3 + i / 3].erase(*it); if (solve(board, i) == false) { rflag[i].insert(*it); cflag[j].insert(*it); bflag[j / 3 * 3 + i / 3].insert(*it); } else { return true; } } board[i][j] = '.'; // 标回去 return false; } } } return true; // end }};
参考后
class Solution {public: void solveSudoku(vector<vector<char>>& board) { solve(board, 0); }private: bool solve(vector<vector<char> >& board, size_t r) { size_t size = board.size(); for (size_t i = r; i < size; ++i) { for (size_t j = 0; j < size; ++j) { char ch = board[i][j]; if (ch == '.') { for (int k = 1; k <= 9; ++k) { char val = '0' + k; if (isValid(board, i, j, val)) { board[i][j] = val; if (solve(board, i) == true) return true; } } board[i][j] = '.'; return false; } } } return true; // fill all the empty, all the solve is end } bool isValid(vector<vector<char> >& board, size_t row, size_t col, char c) { size_t size = board.size(); size_t val = 'c' - '0'; for (size_t i = 0; i < size; ++i) { // check row // check column // check block if (board[i][col] == c || board[row][i] == c || board[(row / 3 * 3 + col / 3) / 3 * 3 + i / 3][(row / 3 * 3 + col / 3) % 3 * 3 + i % 3] == c) return false; } return true; }};
阅读全文
0 0
- Leetcode 37 Sudoku Solver
- Leetcode 37: Sudoku solver
- [leetcode 37] Sudoku Solver
- LeetCode(37) Sudoku Solver
- leetcode 37:Sudoku Solver
- leetcode 37: Sudoku Solver
- Leetcode #37 Sudoku Solver
- leetcode-37 Sudoku Solver
- leetcode 37:Sudoku Solver
- LeetCode 37: Sudoku Solver
- LeetCode 37 - Sudoku Solver
- LeetCode(37)-Sudoku Solver
- leetcode 37 Sudoku Solver
- LeetCode 37 Sudoku Solver
- LeetCode 37 SudoKu Solver
- LeetCode 37 Sudoku Solver
- leetcode-37-sudoku solver
- Leetcode (37) Sudoku Solver
- 自己修改, jquery实现table动态添加行、删除行以及行的上移和下移
- java爬虫爬取美女图片
- Qt中常用到的快捷键
- rpm之参数详解
- UVa10891 Game of Sum(dp)
- leetcode 37 Sudoku Solver
- 设计模式【原型模式Prototype Pattern】
- CentOS6.5/RedHat6破解root密码
- HashMap JDK9源码解读
- RHEL7/Centos7破解root密码
- Android Studio生成get,set,tostring,构造方法
- Spring黑马笔记入门四
- 给定一个二维数组包含X与O,将数组中与四边相连的O以及四边的O不变,其他O变为X
- 对Hibernate的session的理解