#LeetCode 332. Reconstruct Itinerary
#LeetCode 332. 文字讲解:代码随想录
终止条件:ticketNum 的数目。对于比较器不太熟悉.. 后期补这个题目吧。
#LeetCode 51. N-Queens
#LeetCode 51. 视频讲解:这就是传说中的N皇后? 回溯算法安排!| LeetCode:51.N皇后_哔哩哔哩_bilibili
n皇后的约束条件是不能同行、不能同列、不能同斜线,这个约束条件会写为isValid 函数来判断是否能够放置皇后。如果搜索到了树的叶子节点,说明找到了皇后的位置,树的深度就是棋盘的宽度。
代码:
class Solution {
List<List<String>> result = new ArrayList<>();
public List<List<String>> solveNQueens(int n) {
char[][] chessboard = new char[n][n];
for (char[] c : chessboard) {
Arrays.fill(c, '.');
}
backtracking(chessboard, n, 0);
return result;
}
public void backtracking(char[][] chessboard, int n, int row) {
if (row == n) {
result.add(Array2List(chessboard));
return;
}
for (int i = 0; i < n; i++) {
if (isValid(chessboard, row, i, n)) {
chessboard[row][i] = 'Q';
backtracking(chessboard, n, row + 1);
chessboard[row][i] = '.';
}
else {
chessboard[row][i] = '.';
}
}
}
public boolean isValid(char[][] chessboard, int row, int column, int n) {
for (int i=0; i<row; ++i) {
if (chessboard[i][column] == 'Q') {
return false;
}
}
for (int i = row - 1, j = column - 1; i >= 0 && j >= 0; i--, j--) {
if (chessboard[i][j] == 'Q') {
return false;
}
}
for (int i = row - 1, j = column + 1; i >= 0 && j <= n - 1; i--, j++) {
if (chessboard[i][j] == 'Q') {
return false;
}
}
return true;
}
public List Array2List(char[][] chessboard) {
List<String> list = new ArrayList<>();
for (char[] c : chessboard) {
list.add(String.copyValueOf(c));
}
return list;
}
}
#LeetCode37. Sudoku Solver
#LeetCode 37. 视频讲解:回溯算法二维递归?解数独不过如此!| LeetCode:37. 解数独_哔哩哔哩_bilibili
这里的backtracking 用的是布尔类型的返回值,为的是可以找到了一个合理的值后就返回。用boolean 来标记是否找到合理的值。
代码:
class Solution {
public void solveSudoku(char[][] board) {
backtracking(board);
}
private boolean backtracking(char[][] board) {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
if (board[i][j] == '.') {
for (char k = '1'; k <= '9'; k++) {
if (isValid(i, j, k, board)) {
board[i][j] = k;
boolean result = backtracking(board);
if (result) {
return true;
}
board[i][j] = '.';
}
}
return false;
}
}
}
return true;
}
private boolean isValid(int row, int column, char num, char[][] board) {
for (int i = 0; i < 9; i++) {
if (board[row][i] == num) {
return false;
}
}
for (int j = 0; j < 9; j++) {
if (board[j][column] == num) {
return false;
}
}
int startRow = (row / 3) * 3;
int startCol = (column / 3) * 3;
for (int i = startRow; i < startRow + 3; i++) {
for (int j = startCol; j < startCol + 3; j++) {
if (board[i][j] == num) {
return false;
}
}
}
return true;
}
}