N皇后用JAVA递归实现
用java 递归实现 N皇后问题
样例输入
4
样例输出
2 4 1 3
3 1 4 2
两行代表两种方法
代码块
基本上都带有注释
package N皇后;
import java.util.Scanner;
public class Main {
static int count=0;
static int n=0;
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入你要解决几个皇后的问题");
n=sc.nextInt();
int[] queenPos=new int[100];
Nqueen(0,queenPos);//有n个皇后 矩阵为n*n
System.out.println(n+"皇后共有 " + count + "种摆放方式");
}
private static void Nqueen(int k,int[] queenPos){//在O~k-1行皇后已经摆好的情况下,摆第k行及其后的皇后 回溯递归
int i;
if (n==k){//说明n个皇后都已经摆好了
for (i = 0; i < n; i++) {//输出矩阵
int y=queenPos[i]+1;
System.out.print(i+","+y+" ");
}
System.out.println();
count++;
}
//摆放第k行的皇后
for (i = 0; i < n; i++) {//皇后有n个位置可以选择 相当于有n列可以位居 x 列
int j;
for (j = 0; j < k; j++) {//j表示前面已经摆好行 queenPos[j]表示已经摆好的皇后所在的列 y 行
//判断 1. queenPos[j]==i 两列是否在同一列上 2.Math.abs(queenPos[j]-i)==Math.abs(k-j) x和y的绝对值之差可以知道是否在斜角
if(queenPos[j]==i||Math.abs(queenPos[j]-i)==Math.abs(k-j)){
break;
//如果位置冲突 跳出forj 循环 此时j不等于k
//如果不满住if 此时j==k
}
}
if(j==k){//位置不冲突
queenPos[k]=i;//存储符合的位置
Nqueen(k+1,queenPos);//进行递归 下一层
}
}
}
}
输出
[x,y]样式输出