N皇后问题java实现
简单来说就是dfs+回溯
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[][] map = new int[n][n];
dfs(map, n, 0);
}
//来一个检查棋子摆放是否合理的方法
private static boolean check(int[][] map, int n, int depth, int k) {
for (int i = 0; i < n; i++) {
//列的情况
//排除本身的情况
if (i == depth) {
continue;
}
if (map[i][k] == 1) {
return false;
}
}
//现在来考虑斜线情况
//左上
for (int i=depth,j=k;i>=0&&j>=0;i--,j--){
if (map[i][j]==1){
return false;
}
}
//右上
for (int i=depth,j=k;i>=0&&j<n;i--,j++){
if (map[i][j]==1){
return false;
}
}
return true;
}
private static void dfs(int[][] map, int n, int depth) {
//递归终止条件
if (depth == n) {
for (int i = 0; i < map.length; i++) {
for (int j = 0; j < map[i].length; j++) {
if (map[i][j] == 0) {
System.out.print(".");
} else if (map[i][j] == 1) {
System.out.print("Q");
}
}
System.out.println();
}
System.out.println();
return;
}
for (int i = 0; i < n; i++) {
//添加判断条件
if (check(map, n, depth, i)) {
//将该点状态进行修改
map[depth][i] = 1;
//递归
dfs(map, n, depth + 1);
//回溯
map[depth][i] = 0;
}
}
}
}