新博文地址:[leetcode]Sudoku Solver
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.
Empty cells are indicated by the character '.'.
You may assume that there will be only one unique solution.
好了,最后一道题了,一直对数独特别害怕,不知道为啥,但是仔细看了这道题,貌似没啥难度,跟八皇后问题一样,典型的回溯算法,当然也可以用迭代实现,我同学用了迭代实现的,因此我就写了一个递归版本的,算法思想就是典型的DFS,因此这里不再啰嗦。
尴尬的是,DFS在找到一个结果的时候会继续回溯寻找下一个可能的结果,因此我又设置了一个全局变量来添加控制。这无疑让代码可读性变差,如果谁有更好的方法:找到一个解之后立马跳出整个递归过程,请告之
代码如下:
boolean over = false; public void solveSudoku(char[][] board) { if (board == null || board.length == 0 || board.length != board[0].length || board.length % 9 != 0) { return; } int height = board.length; int width = board[0].length; dfs(0, 0, board, height, width); } private void dfs(int row, int column, char[][] board, int height, int width) { if(over) return; if (row == board.length ) { over = true; return; } if (board[row][column] != '.' ) { if (column < width - 1 && !over) { dfs(row, column + 1, board, height, width); } else if (column == width - 1 && !over) { dfs(row + 1, 0, board, height, width); } } else { for (char c = '1'; c <= '9' && !over; c++) { if (!isConflict(c, row, column, board)) { board[row][column] = c; if (column < width - 1) { dfs(row, column + 1, board, height, width); } else if (column == width - 1) { dfs(row + 1, 0, board, height, width); } } } if(!over)board[row][column] = '.'; } } private boolean isConflict(char num, int row, int column, char[][] board) { int height = board.length; int width = board[0].length; for (int i = 0; i < width; i++) { if (i != column && board[row][i] == num) { return true; } } for (int i = 0; i < height; i++) { if (i != row && board[i][column] == num) { return true; } } int beginRow = (row / 3) * 3; int endRow = beginRow + 2; int beginColumn = (column / 3) * 3; int endColumn = beginColumn + 2; for (int i = beginRow; i <= endRow; i++) { for (int j = beginColumn; j <= endColumn; j++) { if (i == row && j == column) continue; if (board[i][j] == num) return true; } } return false; }
相关推荐
js js_leetcode题解之37-sudoku-solver.js
leetcode 答案使用计算机视觉和回溯的数独求解器 安装 存储库可以克隆或下载为 zip。 按照说明安装tesseract 其他需求可以通过运行pip install -r requirements.txt来安装 用法 执行代码如下: python main . py '...
9. **Sudoku Solver.cpp** - 第36题“数独求解器”,解冑会利用回溯法来填充值,确保每一行、每一列和每一个宫格内的数字都符合数独规则。 10. **Subsets II .cpp** - 第90题“子集II”,要求找到一个集合的所有不...
Solver 深度优先遍历 回溯 先检查后修改 Group Anagrams 排序 unordered_map Minimum Window Substring 两个指针遍历 map Maximal Rectangle 栈 局部递增 或者 动态规划 Binary Tree Inorder Traversal 栈 递归 ...
Sudoku Solver题目: | 源码:标签:dfs,数独难度:困难 / Hard82. Remove Duplicates from Sorted List II题目: | 源码:标签:单向链表难度:中等 / Medium146. LRU Cache题目: | 源码:标签:哈希表,双向...
- Sudoku Solver: 解数独问题,即给出一个部分填充的数独,要求填充剩余空格。 - Count and Say: 第n个数是“1”,“21”,“1211”,“111221”等描述的下一个数。 - Combination Sum: 找出所有相加之和为特定值的...
数位之和leetcode LeetCode-cpp ...solver: 37 排序 - merge sort - quick sort - insertion sort - selection sort - counting sort 位操作 - find the only element which exists once/twice... - count
在本压缩包文件中,我们聚焦于C语言基础,并通过解决LeetCode编程挑战中的第37题——"Sudoku Solver"(数独求解器)来深入理解和实践C语言编程技巧。LeetCode是一个广泛使用的在线平台,它提供了一系列编程题目,...
- 最后挑战难题,如“Sudoku Solver”和“Kth Smallest Element in a Sorted Matrix”,锻炼算法设计和复杂问题解决能力。 6. **资源利用** - 通过阅读他人的解决方案,可以学习不同的解题思路和优化技巧。 - ...
第37题,即“解数独”(Sudoku Solver),是这类问题的一个经典实例,它要求我们用这两种方法来解决实际问题。在这个题解中,我们将详细探讨递归和回溯的概念,并结合解数独的具体步骤进行讲解。 首先,让我们了解...
* Sudoku Solver:该题目要求解决数独问题,即填充一个9x9的数独矩阵,使得每行、每列、每个小矩阵中的数字唯一。解决该题目需要使用回溯算法,递归地探索所有可能的填充方式,然后逐步回溯,直到找到最优解。 分治...