import java.util.Scanner;
public class EightQueen{
public static final int N=100;//棋盘最大为100*100
public static int []queen=new int[N];
public static int n;
public static int sum=0;
public static void main(String args[]) {
Scanner sc=new Scanner(System.in);
n=sc.nextInt();//传入棋盘大小 n*n
place(0);//调用函数,放第0行的皇后
System.out.println("总共有:"+sum);
}
static boolean attack(int row,int col) {//判断能否把皇后放到第row行,第col列
//检查皇后是否冲突
for(int i=0;i<row;++i) {//遍历第row行前面的皇后
//queen[i]==col表示第i行的皇后在第col列,所以不能放
//Math.abs(queen[i]-col)==Math.abs(i-row),表示第i行,第queen[i]列的皇后和第row行col列在一条斜线(横坐标和纵坐标差值相等),所以不能放
if((queen[i]==col)||Math.abs(queen[i]-col)==Math.abs(i-row)) {
//在同一列 斜线上
return false;
}
}
//当前面的所有皇后都无法攻击到此皇后时可以放
return true;
}
static void place(int cur) {//放第cur行的皇后
//cur代表当前行 queen【】存储棋子放在那一列上
for(int i=0;i<n;++i) {//遍历所有的列
if(attack(cur,i)) {//是否能将第cur行的皇后放到第i列
queen[cur]=i;//将第cur行的皇后放到第i列
if(cur==n-1) {//所有皇后放完了
// 打印结果
/* for(int j=0;j<n;++j)
System.out.print(queen[j]+" ");*/
char temp[][]=new char[n][n];
for(int m=0;m<n;++m) {
temp[m][queen[m]]='#';
}
for(int m=0;m<n;++m) {
for(int g=0;g<n;++g) {
if(temp[m][g]!='#')
temp[m][g]='&';
System.out.print(temp[m][g]);
}
System.out.println();
}
System.out.println();
sum++;
} else//放下一行的皇后
place(cur+1);
}
//此列无法放皇后,进入下一个循环,判断是否能把皇后放到下一列,如果能则递归,当所有列都尝试了不能,则回溯到上一个方法栈,移动上一行的皇后
}
}
}
N皇后问题Java——递归+回溯
最新推荐文章于 2025-04-24 10:01:07 发布