leetcode第37题

简介: 从上到下,从左到右遍历每个空位置。在第一个位置,随便填一个可以填的数字,再在第二个位置填一个可以填的数字,一直执行下去直到最后一个位置。期间如果出现没有数字可以填的话,就回退到上一个位置,换一下数字,再向后进行下去。

image.png给定一个数独棋盘,输出它的一个解。

解法一 回溯法

从上到下,从左到右遍历每个空位置。在第一个位置,随便填一个可以填的数字,再在第二个位置填一个可以填的数字,一直执行下去直到最后一个位置。期间如果出现没有数字可以填的话,就回退到上一个位置,换一下数字,再向后进行下去。

publicvoidsolveSudoku(char[][] board) {
solver(board);
}
privatebooleansolver(char[][] board) {
for (inti=0; i<9; i++) {
for (intj=0; j<9; j++) {
if (board[i][j] =='.') {
charcount='1';
while (count<='9') {
if (isValid(i, j, board, count)) {
board[i][j] =count;
if (solver(board)) {
returntrue;
                        } else {
//下一个位置没有数字,就还原,然后当前位置尝试新的数board[i][j] ='.';
                        }
                    }
count++;
                }
returnfalse;
            }
        }
    }
returntrue;
}
privatebooleanisValid(introw, intcol, char[][] board, charc) {
for (inti=0; i<9; i++) {
if (board[row][i] ==c) {
returnfalse;
        }
    }
for (inti=0; i<9; i++) {
if (board[i][col] ==c) {
returnfalse;
        }
    }
intstart_row=row/3*3;
intstart_col=col/3*3;
for (inti=0; i<3; i++) {
for (intj=0; j<3; j++) {
if (board[start_row+i][start_col+j] ==c) {
returnfalse;
            }
        }
    }
returntrue;
}


时间复杂度:

空间复杂度:O(1)。

回溯法一个很典型的应用了。

相关文章
|
6月前
leetcode20刷题打卡
leetcode20刷题打卡
31 0
|
6月前
leetcode24刷题打卡
leetcode24刷题打卡
25 0
|
6月前
刷题之Leetcode54题(超级详细)
刷题之Leetcode54题(超级详细)
30 0
|
6月前
|
算法
刷题之Leetcode704题(超级详细)
刷题之Leetcode704题(超级详细)
33 0
|
6月前
刷题之Leetcode283题(超级详细)
刷题之Leetcode283题(超级详细)
25 0
|
6月前
leetcode1047刷题打卡
leetcode1047刷题打卡
34 0
|
Java 测试技术 C语言
leetcode刷题(3)
各位朋友们大家好,今天是我leedcode刷题系列的第三篇,废话不多说,直接进入主题。
|
存储 Java 测试技术
leetcode刷题(6)
各位朋友们大家好,今天是我的leetcode刷题系列的第六篇。这篇文章将与队列方面的知识相关,因为这些知识用C语言实现较为复杂,所以我们就只使用Java来实现。
|
测试技术 索引
leetcode刷题(2)
各位朋友们,又是新的一天,不知道大家过得怎样?今天是我leedcode刷题系列的第二篇,那么废话不多说,直接进入我们今天的主题。