DFS 八皇后问题
八皇后问题 一维数组记录
理解了很久/(ㄒoㄒ)/~~
一维数组代码
static int n=8;
static int [] a=new int[n];// a[i]表示第i行上的皇后放于a[i]列上,假设a[3]=7 放于第3行第7列
static int count=0;
public static void main(String[] args) {
dfs(0);
System.out.println(count);
}
private static void dfs( int row) {//表示第row皇后放于何处
if (row==n) {
count++;
return;
}
//尝试在某一列放一个皇后
for (int i = 0; i <n;i++) {
if(check(row,i)) {
a[row]=i;
dfs(row+1);
// a[row]=0;
}
}
}
private static boolean check(int x, int y) {
for (int i = 0; i <x; i++) {
if (a[i]==y) {//想等说明已经放了
return false;
}
if (i+a[i]==x+y) {//右斜对角线不能放
return false;
}
if (i-a[i]==x-y) {//左斜对角线不能放
return false;
}
}
return true;
}
二维数组
比较容易理解
static int n=4;
static int a[][]=new int [n][n];
static int count=0;
public static void main(String[] args) {
queens8(0);
System.out.println(count);
}
private static void queens8(int row) {
if (row==n) {
count++;
printQueens();
return;
}
for (int i = 0; i <n; i++) {
if (check(row,i)) {//检查是否合法摆放
a[row][i]=1;//标记皇后位置
queens8(row+1);
a[row][i]=0;//回溯
}
}
}
private static boolean check(int x, int y) {
for (int i = 0; i < x; i++) {//已经摆放过了
if (a[i][y]==1) {
return false;
}
}
for(int i=x-1, j=y-1; i>=0 && j >= 0; i--, j--) {//左斜对角线不能放
if (a[i][j] == 1) { //递减 检查与前面的行列是否有冲突
return false;
}
}
for(int i=x-1, j=y+1; i>=0 && j<n; i--, j++) {//右斜对角线不能放
if (a[i][j] == 1) {
return false;
}
}
return true;
}
private static void printQueens() {
for(int i=0; i<n; i++) {
for(int j=0; j<n; j++) {
System.out.print(a[i][j] + " ");
}
System.out.println();
}
System.out.println();
}