1. 重新安排行程(跳过)
2. N皇后
向下递归每一行,递归一层就是一行
每一行遍历每一列
再对每个位置的Q检查合法性,不合法就跳过当前列,继续判断下一列
判断合法性,向上判断,三个方向
class Solution {
List<List<String>> res;
char[][] board;
public List<List<String>> solveNQueens(int n) {
res = new ArrayList<>();
board = new char[n][n];
for(char[] c : board) {
Arrays.fill(c, '.');
}
backTracking(n, 0);
return res;
}
public void backTracking(int n, int row){
if(row == n){
res.add(Array2List());
return;
}
for(int col = 0; col < n; col++){
if(isValid(n, row, col)){
board[row][col] = 'Q';
backTracking(n, row + 1);
board[row][col] = '.';
}
}
}
public List Array2List() {
List<String> list = new ArrayList<>();
for (char[] c : board) { // 一行
list.add(String.valueOf(c));
}
return list;
}
public boolean isValid(int n, int row, int col){
for(int i = row - 1; i >= 0; i--){ // 向上同一列
if(board[i][col] == 'Q')
return false;
}
// 右斜上45
for(int i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++){
if(board[i][j] == 'Q')
return false;
}
// 左斜上45
for(int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--){
if(board[i][j] == 'Q')
return false;
}
return true;
}
}
3. 解数独(理解思路)
public boolean backTracking(char[][] board){
for(int i = 0; i < 9; i++){
for(int j = 0; j < 9; j++){
if(board[i][j] != '.')
continue;
for(int t = '1'; t < '9'; t++){
if(isValid(board, i, j, t)){
board[i][j] = t;
if(backTracking(board))
return true;
board[i][j] = '.';
}
}
return false;
}
}
return true;
}