51. N 皇后

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/n-queens
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
// 做完数独的题,就会有固有思维。一个一个的试,但是一行只能有一个,那么一个一个试其中有可能n-1次都是无效的。
// 所以按照行为单位,一行中放一个,之后进入下一行的逻辑
List<List<String>> ret = new ArrayList<>();
public List<List<String>> solveNQueens(int n) {
char[][] board = new char[n][n];
dfs(board,0);
return ret;
}
public void dfs(char[][] board, int row) {
if(row == board.length) {
// 既然已经到了这步,说明每一行都放了。
List<String> list = new ArrayList<>();
for(int i=0;i<board.length;i++) {
StringBuilder sb = new StringBuilder();
for(int j=0;j<board.length;j++) {
// 这里追加的时候注意:就是如果一个位置成功了,那么这行的后面都是空的,所以特殊处理下
sb.append(board[i][j] == 'Q' ? 'Q' : '.');
}
list.add(sb.toString());
}
ret.add(list);
return;
}
// 对于该行来说,有n中选择。每一个都试
for(int i=0;i<board.length;i++) {
if(!checkOther(board,row,i)) {
continue;
}
board[row][i] = 'Q';
dfs(board,row+1);
board[row][i] = '.';
}
}
public boolean checkOther(char[][] board,int row, int col) {
for(int i=0;i<board.length;i++) {
if(board[row][i] == 'Q') {
return false;
}
}
for(int i=0;i<board.length;i++) {
if(board[i][col] == 'Q') {
return false;
}
}
int p=row;
int q=col;
while(q>=0 && p>=0) {
if(board[p][q] == 'Q') {
return false;
}
p--;
q--;
}
p=row;
q=col;
while(p>=0 && q<board.length) {
if(board[p][q] == 'Q') {
return false;
}
p--;
q++;
}
p=row;
q=col;
while(p<board.length && q >=0) {
if(board[p][q] == 'Q') {
return false;
}
p++;
q--;
}
p=row;
q=col;
while(p<board.length && q<board.length) {
if(board[p][q] == 'Q') {
return false;
}
p++;
q++;
}
return true;
}
浙公网安备 33010602011771号