原题链接
https://leetcode-cn.com/problems/n-queens/
import java.util.ArrayList;
import java.util.List;
public class solveNQueens {
int c;
ArrayList<List<String>> res = new ArrayList<>();
public List<List<String>> solveNQueens(int n) {
if(n==1)
{
ArrayList<String> tmp = new ArrayList<>();
tmp.add("Q");
res.add(tmp);
return res;
}
c=n;
char[][] matrix = new char[n][n];
dfs(0,0,n,matrix);
return res;
}
public void dfs(int y,int x,int n,char[][] matrix){
if(y==c-1&x==c){
if(n==0){
ArrayList<String> tmp = new ArrayList<>();
for(int i =0;i<c;i++)tmp.add(String.valueOf(matrix[i]));
res.add(tmp);
}
return;
}
if(x==c){
if(n==c)return;
dfs(y+1,0,n,matrix);
}
else{
if(checkPoint(y,x,matrix)&&n>0){
matrix[y][x] = 'Q';
dfs(y,x+1,n-1,matrix);
}
matrix[y][x] = '.';
dfs(y,x+1,n,matrix);
}
}
public boolean checkPoint(int y,int x,char[][]matrix){
for(int i =0;i<c;i++){
if(matrix[i][x]=='Q')return false;
}
for(int i =0;i<c;i++){
if(matrix[y][i]=='Q')return false;
}
int checkY;
int checkX;
// 左上
checkY=y;
checkX=x;
while(checkX>=0&&checkY>=0){
if(matrix[checkY][checkX]=='Q')return false;
checkX--;
checkY--;
}
// 右下
checkY=y;
checkX=x;
while(checkX<c&&checkY<c){
if(matrix[checkY][checkX]=='Q')return false;
checkX++;
checkY++;
}
// 左下
checkY=y;
checkX=x;
while(checkX>=0 && checkY<c){
if(matrix[checkY][checkX]=='Q')return false;
checkX--;
checkY++;
}
// 右上
checkY=y;
checkX=x;
while(checkX<c&&checkY>=0){
if(matrix[checkY][checkX]=='Q')return false;
checkX++;
checkY--;
}
return true;
}
public static void main(String[] args) {
solveNQueens solveNQueens = new solveNQueens();
System.out.println(solveNQueens.solveNQueens(5));
}
}