leetcode: Sudoku Solver
来源:互联网 发布:淘宝怎么开通直播 编辑:程序博客网 时间:2024/06/08 00:22
DFS,回溯,AC
class Solution {public: void solveSudoku(vector<vector<char> > &board) { solve( board); } bool isvalid( vector< vector< char> > &board, int row, int col){ for( int i = 0; i < board.size(); ++i){ if( i != row && board[i][col] == board[row][col]) return false; } for( int j = 0; j < board[0].size(); ++j){ if( j != col && board[row][j] == board[row][col]) return false; } int blocki = row / 3; int blockj = col / 3; for( int i = blocki * 3; i < blocki * 3 + 3; ++i){ for( int j = blockj * 3; j < blockj * 3 + 3; ++j){ if( i != row && j != col && board[i][j] == board[row][col]) return false; } } return true; } bool solve( vector< vector< char> > &board){ for( int i = 0; i < board.size(); ++i){ for( int j = 0; j < board[i].size(); ++j){ if( board[i][j] == '.'){ for( int k = '1'; k <= '9'; ++k){ board[i][j] = k; if( isvalid( board, i, j) && solve( board)) return true; board[i][j] = '.'; } return false; } } } return true; }};
直接模拟,意料之中的TLE
class Solution {public: void solveSudoku(vector<vector<char> > &board) { generateCandidates( board, candidates); while( true){ for( int i = 0; i < board.size(); ++i){ for( int j = 0; j < board[i].size(); ++j){ if( candidates[i][j].size() == 1){ board[i][j] = *(candidates[i][j].begin()); if(solved( board)) return; candidates[i][j].erase( candidates[i][j].begin()); generateCandidates( board, candidates); } } } } } bool solved( vector< vector< char> > &board){ for( int i = 0; i < board.size(); ++i) for( int j = 0; j < board[i].size(); ++j) if( board[i][j] == '.') return false; return true; } void generateCandidates( vector< vector< char> > &board, vector< vector< set< char> > > &candidates){ set< char> nums; for( int i = '1'; i <= '9'; ++i) nums.insert(i); for( int i = 0; i < 9; ++i){ candidates.push_back( vector< set< char> >( 9, nums)); } for( int i = 0; i < board.size(); ++i){ for( int j = 0; j < board[i].size(); ++j){ if( board[i][j] == '.'){ modifyCandidates( board, candidates, i, j); } } } } void modifyCandidates( vector< vector< char> > &board, vector< vector< set< char> > > &candidates, int row, int col){ for( int i = 0; i < board.size(); ++i){ if( board[i][col] != '.'){ if( candidates[row][col].count( board[i][col])) candidates[row][col].erase( board[i][col]); } } for( int j = 0; j < board[0].size(); ++j){ if( board[row][j] != '.'){ if( candidates[row][col].count( board[row][j])) candidates[row][col].erase( board[row][j]); } } int blocki = row / 3; int blockj = col / 3; for( int i = blocki * 3; i <= blocki * 3 + 2; ++i){ for( int j = blockj * 3; j <= blockj * 3 + 2; ++j){ if( board[i][j] != '.'){ if( candidates[row][col].count( board[i][j])) candidates[row][col].erase( board[i][j]); } } } }private: vector< vector< set< char> > > candidates;};
0 0
- 【LeetCode】Valid Sudoku && Sudoku Solver
- [Leetcode]Sudoku Solver&&Valid Sudoku
- leetcode Valid Sudoku & Sudoku Solver
- Leetcode 37 Sudoku Solver
- [Leetcode] Sudoku Solver
- Leetcode 37: Sudoku solver
- LeetCode Sudoku Solver
- [LeetCode]Sudoku Solver
- Leetcode Sudoku Solver
- LeetCode-Sudoku Solver
- LeetCode - Sudoku Solver
- LeetCode:Sudoku Solver
- 【leetcode】Sudoku Solver
- Leetcode: Sudoku Solver
- leetcode Sudoku Solver
- LeetCode | Sudoku Solver
- LeetCode Sudoku Solver
- [Leetcode] Sudoku Solver (Java)
- android greenDao SQLite数据库操作工具类
- spring boot集成shiro,使用java annotation配置而不是xml配置的经验
- Unity3D Update() 和 FixedUpdate()区别
- JS验证邮箱和手机号
- Linux 不同服务器间传递文件 不需要输入密码
- leetcode: Sudoku Solver
- 学生信息管理系统(7)——应用程序与数据库连接
- poj 1329 计算几何
- 如何取消(或关闭)win2003中的ie增强安全配置
- WinCE调大image
- 软件版本号规范与命名原则
- Android如何最优化的读取一张Bitmap
- 个人投资体系总结
- 基于opc架构的数据采集系统及应用