`
huntfor
  • 浏览: 201508 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

[leetcode]Sudoku Solver

 
阅读更多

新博文地址:[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.

 好了,最后一道题了,一直对数独特别害怕,不知道为啥,但是仔细看了这道题,貌似没啥难度,跟八皇后问题一样,典型的回溯算法,当然也可以用迭代实现,我同学用了迭代实现的,因此我就写了一个递归版本的,算法思想就是典型的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-leetcode题解之37-sudoku-solver.js

    js js_leetcode题解之37-sudoku-solver.js

    leetcode答案-SudokuSolver:使用计算机视觉和回溯解决数独

    leetcode 答案使用计算机视觉和回溯的数独求解器 安装 存储库可以克隆或下载为 zip。 按照说明安装tesseract 其他需求可以通过运行pip install -r requirements.txt来安装 用法 执行代码如下: python main . py '...

    Leetcode部分解答(126题)

    9. **Sudoku Solver.cpp** - 第36题“数独求解器”,解冑会利用回溯法来填充值,确保每一行、每一列和每一个宫格内的数字都符合数独规则。 10. **Subsets II .cpp** - 第90题“子集II”,要求找到一个集合的所有不...

    dna匹配leetcode-leetcode:leetcode刷题

    Solver 深度优先遍历 回溯 先检查后修改 Group Anagrams 排序 unordered_map Minimum Window Substring 两个指针遍历 map Maximal Rectangle 栈 局部递增 或者 动态规划 Binary Tree Inorder Traversal 栈 递归 ...

    LeetCode:关于LeetCode.com和ACM的一些算法问题

    Sudoku Solver题目: | 源码:标签:dfs,数独难度:困难 / Hard82. Remove Duplicates from Sorted List II题目: | 源码:标签:单向链表难度:中等 / Medium146. LRU Cache题目: | 源码:标签:哈希表,双向...

    _leetcode-python.pdf

    - Sudoku Solver: 解数独问题,即给出一个部分填充的数独,要求填充剩余空格。 - Count and Say: 第n个数是“1”,“21”,“1211”,“111221”等描述的下一个数。 - Combination Sum: 找出所有相加之和为特定值的...

    數位之和leetcode-leetcode-cpp:我的LeetCodeC++答案

    数位之和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语言基础-C语言编程基础之Leetcode编程题解之第37题解数独.zip

    在本压缩包文件中,我们聚焦于C语言基础,并通过解决LeetCode编程挑战中的第37题——"Sudoku Solver"(数独求解器)来深入理解和实践C语言编程技巧。LeetCode是一个广泛使用的在线平台,它提供了一系列编程题目,...

    leetcode_solutions:Leetcode问题的解决方案

    - 最后挑战难题,如“Sudoku Solver”和“Kth Smallest Element in a Sorted Matrix”,锻炼算法设计和复杂问题解决能力。 6. **资源利用** - 通过阅读他人的解决方案,可以学习不同的解题思路和优化技巧。 - ...

    javascript-leetcode面试题解递归与回溯问题之第37题解数独-题解.zip

    第37题,即“解数独”(Sudoku Solver),是这类问题的一个经典实例,它要求我们用这两种方法来解决实际问题。在这个题解中,我们将详细探讨递归和回溯的概念,并结合解数独的具体步骤进行讲解。 首先,让我们了解...

    2、DFS、回溯、分治法必练题(含答案).pdf

    * Sudoku Solver:该题目要求解决数独问题,即填充一个9x9的数独矩阵,使得每行、每列、每个小矩阵中的数字唯一。解决该题目需要使用回溯算法,递归地探索所有可能的填充方式,然后逐步回溯,直到找到最优解。 分治...

Global site tag (gtag.js) - Google Analytics