[leetcode] 37. 解数独(Java)(dfs,递归,回溯)
1A
这个题其实15分钟左右就敲出来并且对了。。。但是由于我输错了一个数。。导致我白白debug一个多小时。。
没啥难度,练递归-dfs的好题
class Solution {
private int which(int i, int j) {
if (i <= 2) {
if (j <= 2)
return 1;
if (j <= 5)
return 2;
return 3;
}
if (i <= 5) {
if (j <= 2)
return 4;
if (j <= 5)
return 5;
return 6;
}
if (j <= 2)
return 7;
if (j <= 5)
return 8;
return 9;
}
public void solveSudoku(char[][] board) {
int[][] k = new int[10][10];
// heng
int[][] p = new int[10][10];
// shu
int[][] q = new int[10][10];
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
if (board[i][j] != '.') {
p[i][board[i][j] - '0'] = 1;
q[j][board[i][j] - '0'] = 1;
k[which(i, j)][board[i][j] - '0'] = 1;
}
}
}
dfs(k, p, q, board, 0, 0);
}
private boolean dfs(int[][] k, int[][] p, int[][] q, char[][] board, int i, int j) {
if (j == 9) return true;
if (board[i][j] != '.') {
if (i + 1 < 9) {
boolean rst = dfs(k, p, q, board, i + 1, j);
if (rst) {
return true;
}
} else {
boolean rst = dfs(k, p, q, board, 0, j + 1);
if (rst) {
return true;
}
}
} else {
for (int x = 1; x <= 9; x++) {
if (p[i][x] != 1 && q[j][x] != 1 && k[which(i, j)][x] != 1) {
p[i][x] = 1;
q[j][x] = 1;
k[which(i, j)][x] = 1;
board[i][j] = (char) (x + '0');
if (i + 1 < 9) {
boolean rst = dfs(k, p, q, board, i + 1, j);
if (rst) {
return true;
}
} else {
boolean rst = dfs(k, p, q, board, 0, j + 1);
if (rst) {
return true;
}
}
p[i][x] = 0;
q[j][x] = 0;
k[which(i, j)][x] = 0;
board[i][j] = '.';
}
}
}
return false;
}
}
[leetcode] 37. 解数独(Java)(dfs,递归,回溯)的更多相关文章
- 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.解数独 [##]
@author: ZZQ @software: PyCharm @file: leetcode37_solveSudoku.py @time: 2018/11/20 16:41 思路:递归回溯 首先, ...
- Leetcode之回溯法专题-37. 解数独(Sudoku Solver)
Leetcode之回溯法专题-37. 解数独(Sudoku Solver) 编写一个程序,通过已填充的空格来解决数独问题. 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次.数字 1 ...
- [leetcode] 39. 组合总和(Java)(dfs、递归、回溯)
39. 组合总和 直接暴力思路,用dfs+回溯枚举所有可能组合情况.难点在于每个数可取无数次. 我的枚举思路是: 外层枚举答案数组的长度,即枚举解中的数字个数,从1个开始,到target/ min(c ...
- leetcode刷题-37解数独
题目 编写一个程序,通过已填充的空格来解决数独问题. 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次.数字 1-9 在每一列只能出现一次.数字 1-9 在每一个以粗实线分隔的 3x ...
- 【LeetCode】解数独
做题之前先复习下[STL中的Tuple容器] 我们知道,在Python中,大家都知道tuple这个概念,是一个只读的元素容器,容器内的元素数据类型可以不同,而在CPP中大部分的容器只能储存相同数据类型 ...
- [LeetCode] Combinations (bfs bad、dfs 递归 accept)
Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. For exampl ...
- leetcode 37 Sudoku Solver java
求数独,只要求做出一个答案就可以. 刚开始对题意理解错误,以为答案是唯一的, 所以做了很久并没有做出来,发现答案不唯一之后,使用回溯.(还是借鉴了一下别人) public class Solution ...
随机推荐
- Day04_17_常用Arrays类
常用Arrays类 Arrays.toString()方法 该方法是用来将数组中得内容转换成String类型,进行输出.入参可以是(byte,int,long,float,double,boolean ...
- 模拟退火算法Python编程(2)约束条件的处理
1.最优化与线性规划 最优化问题的三要素是决策变量.目标函数和约束条件. 线性规划(Linear programming),是研究线性约束条件下线性目标函数的极值问题的优化方法,常用于解决利用现有的资 ...
- 转载:java.math.BigDecimal 比较大小
BigDecimal a = new BigDecimal (101); BigDecimal b = new BigDecimal (111); //使用compareTo方法比较 //注意:a.b ...
- hdu1960 最小路径覆盖
题意: 给你明天的出租车订单,订单中包含每个人的起点和终点坐标,还有时间,如果一辆出租车想接一个乘客必须在每个订单前1分钟到达,也就是小于等于time-1,问你完成所有订单要最少多少量出租 ...
- Windows本地安全策略
目录 本地安全策略 密码策略 账户策略 审核策略 用户权限分配 安全选项 本地安全策略 安全策略是影响计算机安全性的安全设置的组合.可以利用本地安全策略来编辑本地计算机上的帐户 系统安全策略包括下面的 ...
- Windows核心编程笔记之错误处理
0x01 GetLastError() 函数用于获取上一个操作的错误代码 #include <Windows.h> #include <iostream> using name ...
- Windows PE变形练手3-把通用模板机器码直接覆盖目标PE
把通用模板机器码直覆盖目标PE 这个地方真是尝试了好久,遇到很多坑点,Win PE那本书上的东西有点不够,也就直接写书上的例子会发现很多地方不是说的那样,里面提供的信息太少了,就比如里面并没有提被注入 ...
- Redis数据结构—链表与字典的结构
目录 Redis数据结构-链表与字典的结构 链表 Redis链表节点的结构 Redis链表的表示 Redis链表用在哪 字典 Redis字典结构总览 Redis字典结构分解 Redis字典的使用 Re ...
- androidstudio2.0引用.so文件
1.将.so文件复制到libs目录下: 2.在build.gradle中添加下面的代码 sourceSets.main.jniLibs.srcDirs = ['libs'] 结果示例: (上面的1.2 ...
- ThinkPHP5查询-select与find理解
出现问题 在tp5框架中判断select查询结果是否为空时,无论查询条件是否满足,判断查询结果都不为空 解析问题 select查询的是多条数据,若查询数据为空,则返回一个空的二维数组 array(ar ...