LeetCode Sudoku Solver 数独C++程序
来源:互联网 发布:如何添加178软件源 编辑:程序博客网 时间:2024/05/16 02:02
Sudoku Solver
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.
本题使用回溯法来解题,思路:
1 使用两个循环,逐个检查所有的方格
2 每到一个方格,检查到位空,以‘.'字符代表,就循环使用’1‘<=a<=9字符测试是否合法。
3 如果a合法,那么就继续填写下一个
4 如果不合法那么就回溯到上一个空格。
这里最巧妙和最难的地方就是在第2步中,逐个循环检查'1'<=a<='9'循环中使用了递归,就是如果当前字符合法,然后递归检查下个空格。这样程序就变得非常简洁。
还有难点就是判断什么时候需要返回真或者假。有两个地方:
1 当前测试'1'到'9'个数字都不合法,那么返回假
2 棋盘中所有空格都填满,那么就返回真
判断和Leetcode另外一个题目判断Sudoku是否合法的题目不同的就是,这里只需要判断当前格,一个循环就可以了,不需要判断所有的格。
const static int SQUNUM = 9;const static int NUM = 3;bool isValid(vector<vector<char> > &board, int row, int col){int sRow = row / NUM;int sCol = col / NUM;for (int i = 0; i < SQUNUM; i++){if (i != col && board[row][col] == board[row][i])return false;if (i != row && board[row][col] == board[i][col])return false;int r = sRow*NUM + i/NUM, c = sCol*NUM + i%NUM;if (!(r == row && c == col) && board[row][col] == board[r][c])return false;}return true;}bool solveSudoku(vector<vector<char> > &board){for (int i = 0; i < SQUNUM; i++){for (int j = 0; j < SQUNUM; j++){if (board[i][j] == '.'){//本程序精华:主要的回溯思想就是这个循环和递归体现出来//1. 逐个可行答案'1'->'9'去填写试一试是否可行for (char a = '1'; a <= '9'; a++){//填写board[i][j] = a;//测试是否可行if (isValid(board, i, j) && solveSudoku(board))//可行返回真return true;//不可行,回溯,即回到本次回溯前的状态board[i][j] = '.';}//本格不符合规则,那么就可以马上返回了,所以不用到所有循环外。//就是不用等到之后的循环完了。return false;}}}//别忘记了最后,i==9&&j==9的时候跳出循环,这个时候就是成功了,要返回truereturn true;}
2014-1-26 update
更新一个更加简洁容易理解, 且相对上面的程序不那么容易出错,的标准递归回溯法程序:
主要少了个两重循环,容易驾驭多了。
class Solution {public: void solveSudoku(vector<vector<char> > &board) {solve2(board);}bool solve2(vector<vector<char> > &board, int row = 0, int col = 0){if (row == 9) return true;int nr = col==8? row+1:row;int nc = col==8? 0:col+1;if (board[row][col] != '.'){if (solve2(board, nr, nc)) return true;}else{for (char i = '1'; i <= '9'; i++){board[row][col] = i;if (isValid(board, row, col) && solve2(board, nr, nc)) return true;}board[row][col] = '.';}return false;}const static int SQUNUM = 9;const static int NUM = 3;bool isValid(vector<vector<char> > &board, int row, int col){int sRow = row / NUM;int sCol = col / NUM;for (int i = 0; i < SQUNUM; i++){if (i != col && board[row][col] == board[row][i])return false;if (i != row && board[row][col] == board[i][col])return false;//注意这里的计算公式:先定位小九宫大位置,然后小九宫里面的小位置int r = sRow*NUM + i/NUM, c = sCol*NUM + i%NUM;if (!(r == row && c == col) && board[row][col] == board[r][c])return false;}return true;}};
- LeetCode Sudoku Solver 数独C++程序
- Leetcode-Sudoku Solver(数独)
- LeetCode: Sudoku Solver (数独求解)
- [LeetCode] [数独问题] Sudoku Solver
- 【LeetCode】37. Sudoku Solver 数独求解
- LeetCode:Valid Sudoku,Sudoku Solver(数独游戏)
- leetcode 37. Sudoku Solver 36. Valid Sudoku 数独问题
- 数独求解 Sudoku Solver
- Sudoku Solver:数独求解
- Sudoku Solver 破解数独 @LeetCode 附DFS感想
- Sudoku Solver 破解数独@LeetCode - CSDN blog
- LeetCode 37 Sudoku Solver(求解数独)(*)
- Leetcode #37. Sudoku Solver 数独求解 结题报告
- [LeetCode 36&37] Valid Sudoku & Sudoku Solver (数独问题)
- Sudoku Solver 数独的解决方案
- Sudoku Solver 求解数独问题
- 36/37. Sudoku Solver 数独问题
- leetcode_Valid Sudoku and Sudoku Solver (数独游戏) _easy
- mapreduce 读写lzo文件
- zoj 2562 More Divisors(反素数)
- telnet 命令使用详解
- 嵌入式 Color Keying(抠色)SDL背景透明
- 根据用户输入的字符串生成3个文件
- LeetCode Sudoku Solver 数独C++程序
- 02-算1块,5块,10块,组成100块钱的不同方法
- 搜索引擎的发展和蜘蛛抓取原理
- C++代理类
- 怎样实现二级联动
- Untrusted application launcher?
- dedecms去掉Power by DedeCms版权信息
- 有限差分法求导
- qt链接mysql数据库