AcWing 843. n-皇后问题 Java
原题链接
中等
作者:
leo_0
,
2020-03-18 02:03:32
,
所有人可见
,
阅读 694
题目描述
样例
算法1
import java.util.Scanner;
public class Main {
static int n;
static char[][] g;
static boolean[] col;
static boolean[] dg;
static boolean[] udg;
public static void dfs(int u){
if(u == n){
for(int i=0;i<n;i++){
for(int j = 0;j<n;j++){
System.out.print(g[i][j]);
}
System.out.println();
}
System.out.println();
return;
}
for(int i=0;i< n;i++){
if(!col[i] && !dg[i+u] && !udg[i -u+n-1]) {
g[u][i] = 'Q';
col[i] = true;
dg[u+i] = true;
udg[i-u+n-1] = true;
dfs(u+1);
col[i] = false;
dg[u+i] = false;
udg[i-u+n-1] = false;
g[u][i] = '.';
}
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
g = new char[n][n];
col = new boolean[n];
dg = new boolean[2*n-1];
udg = new boolean[2*n-1];
for(int i = 0;i<n;i++){
for(int j = 0;j<n;j++){
g[i][j] = '.';
}
}
dfs(0);
}
}
dg / 和 udg \ 是判断对角线是否符合条件, 对角线的个数 = 2边长 - 1. 例: 33的正方向 右上到左下的对角线 / 有5个。udg[i -u+n] 也可以
同疑惑,为什么要用2n-1来判断?斜着的话最多不是也是n个吗?
dg = new boolean[2n-1];
udg = new boolean[2n-1];
为啥数组大小需要开这么大呀;
udg[i -u+n-1] y总不是这里是udg[i -u+n]吗,为什么要怎么写呀
dg / 和 udg \ 是判断对角线是否符合条件, 对角线的个数 = 2边长 - 1. 例: 33的正方向 右上到左下的对角线 / 有5个。udg[i -u+n] 也可以