实现方案
方案一:递归法
public List<List<String>> solveNQueens(int n) {
char[][] queen = new char[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
queen[i][j] = '.';
}
}
List<List<String>> res = new ArrayList<>();
solve(res, queen, 0);
return res;
}
public void solve(List<List<String>> res, char[][] queen, int row){
if (row == queen.length){
res.add(construct(queen));
}
//注意递归中的分支污染
for (int col = 0; col < queen[0].length; col++) {
if (valid(queen, row, col)){
char[][] temp = copy(queen);
temp[row][col] = 'Q';
solve(res, temp, row+1);
}
}
}
public boolean valid(char[][] queen, int row, int col){
for (int i = 0; i < row; i++) {
if (queen[i][col] == 'Q') return false;
}
for (int i = row-1, j = col+1; i >= 0 && j < queen[0].length; i--, j++){
if (queen[i][j] == 'Q') return false;
}
for (int i = row-1, j = col-1; i >= 0 && j >= 0; i--, j--) {
if (queen[i][j] == 'Q') return false;
}
return true;
}
public char[][] copy(char[][] queen){
int row = queen.length;
int col = queen[0].length;
char[][] temp = new char[row][col];
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
temp[i][j] = queen[i][j];
}
}
return temp;
}
public List<String> construct(char[][] queen){
int n = queen.length;
List<String> path = new ArrayList<>();
for (int i = 0; i < n; i++) {
path.add(new String(queen[i]));
}
return path;
}
方案二:回溯法
public List<List<String>> solveNQueens(int n) {
char[][] queen = new char[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
queen[i][j] = '.';
}
}
List<List<String>> res = new ArrayList<>();
solve(res, queen, 0);
return res;
}
public void solve(List<List<String>> res, char[][] queen, int row){
if (row == queen.length){
res.add(construct(queen));
}
//回溯避免递归分支污染
for (int col = 0; col < queen[0].length; col++) {
if (valid(queen, row, col)){
queen[row][col] = 'Q';
solve(res, queen, row+1);
queen[row][col] = '.';
}
}
}
public boolean valid(char[][] queen, int row, int col){
for (int i = 0; i < row; i++) {
if (queen[i][col] == 'Q') return false;
}
for (int i = row-1, j = col+1; i >= 0 && j < queen[0].length; i--, j++){
if (queen[i][j] == 'Q') return false;
}
for (int i = row-1, j = col-1; i >= 0 && j >= 0; i--, j--) {
if (queen[i][j] == 'Q') return false;
}
return true;
}
public char[][] copy(char[][] queen){
int row = queen.length;
int col = queen[0].length;
char[][] temp = new char[row][col];
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
temp[i][j] = queen[i][j];
}
}
return temp;
}
public List<String> construct(char[][] queen){
int n = queen.length;
List<String> path = new ArrayList<>();
for (int i = 0; i < n; i++) {
path.add(new String(queen[i]));
}
return path;
}
参考