n皇后问题 java 代码 蓝桥杯《算法很美》
问题描述:八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。
分析
建议观看 B站最全的2021蓝桥杯算法课《算法很美》
认为讲的很详细。
视频里留了个问题?为什么遍历后rec[]数组不用重新设为0;
我个人的思考在代码后面
java代码
package Dfs;
import java.util.Scanner;
public class n皇后问题 {
static int ctn=0;
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
scan.close();
int[] resa = new int[n];
dfs(resa, 0);
System.out.println(ctn);
}
static void dfs(int[] res, int row) {
if (row == res.length) {
ctn++;
return;
}
for (int col = 0; col < res.length; col++) {
if (check(res, row, col)) {
res[row] = col;
dfs(res, row + 1);
//res[row] = 0;
}
}
}
static boolean check(int[] res, int x, int y) {
for (int j = 0; j < x; j++) {
if (res[j] ==y) {
return false;
}
if(j+res[j]==y+x) {
return false;
}
if(j-res[j]==x-y) {
return false;
}
}
return true;
}
}
假如,将rec数组里重新设为了0;也就是回溯;当下一个for循环,进行的时候,就会进入下一列,所以回溯的是相同行的上一列,之后进行check();check()检查的是之前的行,check()满足的话会赋值下一个col(列值);
(有点绕QAQ)