Leetcode 52、N皇后II

思路:回溯
- 对于此类问题,以及解数独的问题,无论是判断当前网盘格里面的N皇后放置是否合法,或者是判断当前网盘格里面的数独是否正确
- 或者是给定网盘格的长度,放置N皇后;或者直接给出网盘格,把当前网盘格补充成正确的数独
- 大体的思路都是回溯,并且在每一个步骤的时候判断当前位置放置的当前元素是否合法,如果合法就继续回溯,否则就遍历下一个,最后获得结果
class Solution {
List<String> list = new ArrayList<>();
public int totalNQueens(int n) {
char[][] board = new char[n][n];
for(int i = 0; i < n; i++) {
Arrays.fill(board[i], '.');
}
backtrack(board, 0);
return list.size();
}
public void backtrack(char[][] board, int row) {
if(row == board.length) {
StringBuffer sb = new StringBuffer();
for(int i = 0; i < board.length; i++) {
sb.append(new String(board[i]));
}
list.add(sb.toString());
return;
}
for(int i = 0; i < board[row].length; i++) {
if(isValid(board, row, i)) {
board[row][i] = 'Q';
backtrack(board, row + 1);
board[row][i] = '.';
}
}
}
public boolean isValid(char[][] board, int row, int column) {
int r = row, c = column;
while(r >= 0 && c >= 0) {
if(board[r][c] == 'Q') {
return false;
}
r--;
c--;
}
r = row;
c = column;
while(r >= 0 && c < board.length) {
if(board[r][c] == 'Q') {
return false;
}
r--;
c++;
}
r = row;
while(r >= 0) {
if(board[r][column] == 'Q') {
return false;
}
r--;
}
return true;
}
}