当前位置:网站首页>【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;
}
}
边栏推荐
猜你喜欢
重磅!国内首个开放式在线绘图平台Figdraw突破10万用户!发布《奖学金激励计划》:最高5000元!...
使用open3d可视化3d人脸
Gradle系列——Gradle测试,Gradle生命周期,settings.gradle说明,Gradle任务(基于Groovy文档4.0.4)day2-3
170页6万字智慧能源管理平台建设方案书
立新能源深交所上市:市值55亿 哈密国投与国有基金是股东
Longkou united chemical registration: through 550 million revenue xiu-mei li control 92.5% stake
性能测试入门指南
倪光南:openEuler已达国际同类社区水准
gpio analog serial communication
透过现象看本质,如何针对用户做好需求分析
随机推荐
ThreadLocal保存用户登录信息
安培龙IPO过会:年营收5亿 同创伟业与中移创新是股东
你真的会测试用户登录吗?
如何使用 Mashup 技术在 SAP Cloud for Customer 页面嵌入自定义 UI
what is tail tooth feast
透过现象看本质,如何针对用户做好需求分析
【论文笔记】MiniSeg: An Extremely Minimum Network for Efficient COVID-19 Segmentation
什么是闭包?
关于Request复用的那点破事儿。研究明白了,给你汇报一下。
牛客刷SQL--3
预防和制止家庭暴力 人身安全保护令司法解释今起施行
超全!全国近90所大学考研报录比汇总!
响应式2022英文企业官网源码,感觉挺有创意的
iPhone难卖,被欧洲反垄断的服务业务也难赚钱了,苹果的日子艰难
Two Permutations
Timezone setting in MySQL
制售假劣农资、非法占用耕地……公安部公布十起危害粮食生产安全犯罪典型案例
性能测试入门指南
易优压双驱挖掘机压路机器类网站源码 v1.5.8
Longkou united chemical registration: through 550 million revenue xiu-mei li control 92.5% stake