Java回溯法解n皇后问题
程序员文章站
2022-04-07 18:29:49
话不多说上代码;import java.util.Scanner;class GC2{ static int num;//皇后的数目 static int [] feasible;//记录第i列是否存在皇后,因为从第1行开始到最后一行,所以不用记录行数 static int count=0; public static void placequeen(int n) {//在第n行摆放皇后 if(n>num) {//当搜索完最后一行后,输出棋盘情况 count++; S...
话不多说上代码;
import java.util.Scanner;
class GC2{
static int num;//皇后的数目
static int [] feasible;//记录第i列是否存在皇后,因为从第1行开始到最后一行,所以不用记录行数
static int count=0;
public static void placequeen(int n) {//在第n行摆放皇后
if(n>num) {//当搜索完最后一行后,输出棋盘情况
count++;
System.out.println("第"+count+"种情况:");
for(int i =1 ;i<n;i++) {
for (int j=1;j<feasible[i];j++) {
System.out.print(0+" ");}
System.out.print(1+" ");
for (int k=feasible[i]+1;k<=num;k++) {
System.out.print(0+" ");
}
System.out.println();
if(i==n-1) {
System.out.println();
}
}
return;
}
for (int i=1;i<=num;i++) {//i从1列开始,避免弄乱
if(isConflict(n,i)) {
continue;
}
else {
feasible[n]=i;
placequeen(n+1);
}
}
/*
*
* 判断能否在(x,y)放一个皇后的方法
* x表示行号
* y表示列号
*
*
*/
//下面这个方法可以写的更加简便一些,待我吃完饭再写
private static boolean isConflict(int row, int column) { //第n个皇后也代表着第n行
if(row == 1){//第1行永远不会冲突
return false;
}
for (int i = 1; i < row; i++) { //当前的行数
if (feasible[i] == column || ( column - row) == (feasible[i] - i) || (row - column)== (i-feasible[i]) //以前行数减列数与现在的是否相等
|| (row + column) == (feasible[i] + i)) {
return true;
}
}
return false;
}
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
num = sc.nextInt();//输入棋盘的行或列(棋盘行=列)
feasible=new int[num+1];
for (int i = 0; i < feasible.length; feasible[i++] = -1);//初始化棋盘
placequeen(1);
}
}
本文地址:https://blog.csdn.net/qq_52465706/article/details/110265218
上一篇: 小米10pro和红米k30pro哪个好
下一篇: MyBatis核心类简介