图-搜索-DFS-37. 解数独
2020-03-24 22:23:32
问题描述:
编写一个程序,通过已填充的空格来解决数独问题。
一个数独的解法需遵循如下规则:
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
空白格用 '.' 表示。

一个数独。

答案被标成红色。
提示:
给定的数独序列只包含数字 1-9 和字符 '.' 。
你可以假设给定的数独只有唯一解。
给定数独永远是 9x9 形式的。
问题求解:
经典的DFS问题,可以使用回溯法解决。
int[][] rows = new int[9][9];
int[][] cols = new int[9][9];
int[][] boxes = new int[9][9]; public void solveSudoku(char[][] board) {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
char c = board[i][j];
if (c == '.') continue;
int k = c - '0';
rows[i][k - 1] = 1;
cols[j][k - 1] = 1;
boxes[i / 3 * 3 + j / 3][k - 1] = 1;
}
}
helper(board, 0, 0);
} private boolean helper(char[][] board, int row, int col) {
if (row >= 9) return true;
int nr = row;
int nc = col + 1;
if (col == 8) {
nr = nr + 1;
nc = 0;
}
if (board[row][col] != '.') return helper(board, nr, nc);
for (int i = 1; i <= 9; i++) {
if (rows[row][i - 1] == 1 || cols[col][i - 1] == 1 || boxes[row / 3 * 3 + col / 3][i - 1] == 1) continue;
rows[row][i - 1] = 1;
cols[col][i - 1] = 1;
boxes[row / 3 * 3 + col / 3][i - 1] = 1;
board[row][col] = (char)(i + '0');
if (helper(board, nr, nc)) return true;
board[row][col] = '.';
rows[row][i - 1] = 0;
cols[col][i - 1] = 0;
boxes[row / 3 * 3 + col / 3][i - 1] = 0;
}
return false;
}
图-搜索-DFS-37. 解数独的更多相关文章
- [leetcode] 37. 解数独(Java)(dfs,递归,回溯)
37. 解数独 1A 这个题其实15分钟左右就敲出来并且对了...但是由于我输错了一个数..导致我白白debug一个多小时.. 没啥难度,练递归-dfs的好题 class Solution { pri ...
- Leetcode之回溯法专题-37. 解数独(Sudoku Solver)
Leetcode之回溯法专题-37. 解数独(Sudoku Solver) 编写一个程序,通过已填充的空格来解决数独问题. 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次.数字 1 ...
- Java实现 LeetCode 37 解数独
37. 解数独 编写一个程序,通过已填充的空格来解决数独问题. 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一个以粗实 ...
- leetcode 36 有效的数独 哈希表 unordered_set unordersd_map 保存状态 leetcode 37 解数独
leetcode 36 感觉就是遍历. 保存好状态,就是各行各列还有各分区divide的情况 用数组做. 空间小时间大 class Solution { public: bool isValidSud ...
- leetcode刷题-37解数独
题目 编写一个程序,通过已填充的空格来解决数独问题. 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次.数字 1-9 在每一列只能出现一次.数字 1-9 在每一个以粗实线分隔的 3x ...
- Leetcode——37.解数独 [##]
@author: ZZQ @software: PyCharm @file: leetcode37_solveSudoku.py @time: 2018/11/20 16:41 思路:递归回溯 首先, ...
- 【原创】一个基于简单剪枝的DFS解数独程序
问题来源:leetCode Sudoku Solver Write a program to solve aSudoku puzzle by filling the empty cells. Empt ...
- [leetcode]37. Sudoku Solver 解数独
Write a program to solve a Sudoku puzzle by filling the empty cells. A sudoku solution must satisfy ...
- LeetCode37 使用回溯算法实现解数独,详解剪枝优化
本文始发于个人公众号:TechFlow,原创不易,求个关注 数独是一个老少咸宜的益智游戏,一直有很多拥趸.但是有没有想过,数独游戏是怎么创造出来的呢?当然我们可以每一关都人工设置,但是显然这工作量非常 ...
- 深度优先搜索 DFS 学习笔记
深度优先搜索 学习笔记 引入 深度优先搜索 DFS 是图论中最基础,最重要的算法之一.DFS 是一种盲目搜寻法,也就是在每个点 \(u\) 上,任选一条边 DFS,直到回溯到 \(u\) 时才选择别的 ...
随机推荐
- [人工智能]Pytorch基础
PyTorch基础 摘抄自<深度学习之Pytorch>. Tensor(张量) PyTorch里面处理的最基本的操作对象就是Tensor,表示的是一个多维矩阵,比如零维矩阵就是一个点,一维 ...
- HAProxy实现动静分离和负载均衡
由于电脑配置渣,带不动多台虚拟机,所以采用httpd虚拟主机的方式来实现 1 2 3 CentOS 6.7 httpd: 2.2.15 HAProxy: 1.5.4 主机规划 1 2 3 4 5 - ...
- 关于android应用程序的入口
android应用程序,由一到多个Activity组成.每个Activity没有很紧密的联系,因为我们可以在自己的程序中调用其它Activity,特别是调用自己的代码之外生成的Activity,比如a ...
- Oracle最大进程连接数问题
问题描述 分析报告保存功能,在本地测试使用时可以正常保存:但是部署在客户现场的系统该功能无法保存成功(全部保存): ---->代码功能没有问题,问题应该在服务器配置或者数据库配置等方面出现问题: ...
- numpy.random模块用法总结
from numpy import random numpy.random.uniform(low=0.0, high=1.0, size=None) 生出size个符合均分布的浮点数,取值范围为[l ...
- Java入门教程六(内置包装类)
Java 是一种面向对象的编程语言,Java 中的类把方法与数据类型连接在一起,构成了自包含式的处理单元.但在 Java 中不能定义基本类型对象,为了能将基本类型视为对象处理,并能连接相关方法,Jav ...
- 计算机思维的逻辑基础是什么? & 计算思维
l 计算机思维的逻辑基础: 计算机思维是指人们操作计算机时,计算机行使特定功能的运作方式. 逻辑基础则是指支撑事物运作的基本法则. 因而,计算机思维的逻辑基础可以理解为,计算机在行使特定功能时,其运 ...
- springboot连接redis错误 io.lettuce.core.RedisCommandTimeoutException:
springboot连接redis报错 超时连接不上 可以从以下方面排查 1查看自己的配置文件信息,把超时时间不要设置0毫秒 设置5000毫秒 2redis服务长时间不连接就会休眠,也会连接不上 重 ...
- php不用第三个变量,交换两个数的值
//字符串版本 结合使用substr,strlen两个方法实现 $a="a"; $b="b"; echo '交换前 $a:'.$a.',$b:'.$b.'< ...
- php实现下载功能
<?php header("Content-type:text/html;charset=utf-8"); $file_name="1.text"; // ...