当前位置:网站首页>【LeetCode】37、解数独
【LeetCode】37、解数独
2022-08-01 14:36:00 【小曲同学呀】
题目:
编写一个程序,通过填充空格来解决数独问题。
数独的解法需 遵循如下规则:
- 数字 1-9 在每一行只能出现一次。
- 数字 1-9 在每一列只能出现一次。
- 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)
数独部分空格内已填入了数字,空白格用 '.' 表示。
示例1:

输入:
board =
[["5","3",".",".","7",".",".",".","."],
["6",".",".","1","9","5",".",".","."],
[".","9","8",".",".",".",".","6","."],
["8",".",".",".","6",".",".",".","3"],
["4",".",".","8",".","3",".",".","1"],
["7",".",".",".","2",".",".",".","6"],
[".","6",".",".",".",".","2","8","."],
[".",".",".","4","1","9",".",".","5"],
[".",".",".",".","8",".",".","7","9"]]
输出:
[["5","3","4","6","7","8","9","1","2"],
["6","7","2","1","9","5","3","4","8"],
["1","9","8","3","4","2","5","6","7"],
["8","5","9","7","6","1","4","2","3"],
["4","2","6","8","5","3","7","9","1"],
["7","1","3","9","2","4","8","5","6"],
["9","6","1","5","3","7","2","8","4"],
["2","8","7","4","1","9","6","3","5"],
["3","4","5","2","8","6","1","7","9"]]
解释:输入的数独如上图所示,唯一有效的解决方案如下所示:

提示:
board.length == 9
board[i].length == 9
board[i][j] 是一位数字或者 ‘.’
题目数据 保证 输入数独仅有一个解
解题思路:
解数独专用的思路:
类似人的思考方式去尝试,行,列,还有 3*3 的方格内数字是 1~9 不能重复。
我们尝试填充,如果发现重复了,那么擦除重新进行新一轮的尝试,直到把整个数组填充完成。
算法步骤:
- 数独首先
行,列,还有 3*3的方格内数字是 1~9 不能重复。 - 声明布尔数组,表明行列中某个数字是否被使用了, 被用过视为 true,没用过为 false
- 初始化布尔数组,表明哪些数字已经被使用过了。
- 尝试去填充数组,只要行,列, 还有 3*3 的方格内 出现已经被使用过的数字,我们就不填充,否则尝试填充。
- 如果填充失败,那么我们需要回溯。将原来尝试填充的地方改回来。
- 递归直到数独被填充完成。
参考代码:
class Solution {
public void solveSudoku(char[][] board) {
// 三个布尔数组 表明 行, 列, 还有 3*3 的方格的数字是否被使用过
boolean[][] rowUsed = new boolean[9][10];
boolean[][] colUsed = new boolean[9][10];
boolean[][][] boxUsed = new boolean[3][3][10];
// 初始化
for(int row = 0; row < board.length; row++){
for(int col = 0; col < board[0].length; col++) {
int num = board[row][col] - '0';
if(1 <= num && num <= 9){
rowUsed[row][num] = true;
colUsed[col][num] = true;
boxUsed[row/3][col/3][num] = true;
}
}
}
// 递归尝试填充数组
recusiveSolveSudoku(board, rowUsed, colUsed, boxUsed, 0, 0);
}
private boolean recusiveSolveSudoku(char[][]board, boolean[][]rowUsed, boolean[][]colUsed, boolean[][][]boxUsed, int row, int col){
// 边界校验, 如果已经填充完成, 返回true, 表示一切结束
if(col == board[0].length){
col = 0;
row++;
if(row == board.length){
return true;
}
}
// 是空则尝试填充, 否则跳过继续尝试填充下一个位置
if(board[row][col] == '.') {
// 尝试填充1~9
for(int num = 1; num <= 9; num++){
boolean canUsed = !(rowUsed[row][num] || colUsed[col][num] || boxUsed[row/3][col/3][num]);
if(canUsed){
rowUsed[row][num] = true;
colUsed[col][num] = true;
boxUsed[row/3][col/3][num] = true;
board[row][col] = (char)('0' + num);
if(recusiveSolveSudoku(board, rowUsed, colUsed, boxUsed, row, col + 1)){
return true;
}
board[row][col] = '.';
rowUsed[row][num] = false;
colUsed[col][num] = false;
boxUsed[row/3][col/3][num] = false;
}
}
} else {
return recusiveSolveSudoku(board, rowUsed, colUsed, boxUsed, row, col + 1);
}
return false;
}
}

边栏推荐
- docker部署mysql并修改其占用内存大小
- 阿里巴巴测试开发岗P6面试题
- CSDN配置功能总结
- The problem that the column becomes indexed after pd groupby and the aggregation column has no column name
- [机缘参悟-57]:《素书》-4-修身养志[本德宗道章第四]
- 又拿三个大奖?!多力就是要让你吃的更营养更健康
- SQL每日一练(牛客新题库)——第3天: 条件查询
- 免费使用高性能的GPU和TPU—谷歌Colab使用教程
- 制售假劣农资、非法占用耕地……公安部公布十起危害粮食生产安全犯罪典型案例
- MySQL中的时区设置
猜你喜欢
随机推荐
从零开始Blazor Server(4)--登录系统
开放原子全球开源峰会原圆满结束,openEuler模式得到参会者高度认可
SQL query data and sorting
长江欧拉生态创新中心成立,武汉数字经济再添坚实底座
响应式2022英文企业官网源码,感觉挺有创意的
gpio模拟串口通信
预防和制止家庭暴力 人身安全保护令司法解释今起施行
荣信文化通过注册:年营收3.8亿 王艺桦夫妇为实控人
微信UI在线聊天源码 聊天系统PHP采用 PHP 编写的聊天软件,简直就是一个完整的迷你版微信
轮询和长轮询的区别
使用ffmpeg来查看视频的信息,fps,和width,height
使用open3d可视化3d人脸
ThreadLocal保存用户登录信息
MySQL中字符串比较大小(日期字符串比较问题)
Performance Optimization - Animation Optimization Notes
我寻找的方向
JSON数据转换总结(VIP典藏版)
1161. 最大层内元素和
倪光南:openEuler已达国际同类社区水准
性能优化——动画优化笔记









