皇后问题(递归方法)
n皇后是算法中的老题目,主要是熟悉递归算法和为了解决n皇后的变异题目而做准备
题目
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
皇后的位置不能再同一行同一列和对角线上请问有多少种方法
思路
使用递归的方法
1.用一个一维数组用来存放每行皇后的位置,
递归里面是先拿k于k-1的一维数组里面的数进行同列和对角线判断递归的次数n代表有多少个皇后。
如何判断不在同一个对角线,引用到了数学问题,两个数如果在对角线上,其同行相减的绝对值等于同列相减的绝对值。
/**
* @author wuyang
* @version 1.0
* @date 2019/12/7 16:54 皇后问题
*/
public class huanhouProblem {
static int n1= 0;
static int count =0;
// 这里面用四皇后做了测试,如若用n测试则把 new int[4] , 4改成n,和里面代码部分修改。。。
static int b[] = new int[4]; // 下标用来控制第几行,里面的值来控制第几个下标的第几列比如 a[1] =3,则是第2行 第4列
public static void s(int n,int m){
if(m == n){
for (int i = 0; i< 4; i++){
System.out.print(b[i]+" ");
}
count++;
System.out.println();
return;
}
// 这个循环是试探,每一列是否可行,m是用来控制行数
for(int i = 0 ; i < n; i++){
int j=0;
// 下面这个for循环循环的是已经确定的皇后的个数和要放的皇后进行匹配 ,确定要放的皇后的位置是正确的这就是整个算法最重要的思路
for(j = 0 ; j <m ;j++ ){
// b[j] == i 是同列的皇后不能放一起,后面是对角线公式,如果两个数在对角线上则其同行相减同列相减的绝对值是相等的。
if( b[j] == i ||Math.abs(b[j]-i)== Math.abs(m-j)){
// 不满足条件的就break满足条件的就继续循环
break;
}
}
if(j == m){
// 存皇后的位置
b[m] = i;
s(n,m+1);
}
}
}
public static void main(String[] args){
// 仅此输入4,输入其他数字需要修改部分代码。。。。很简单,
Scanner scanner = new Scanner(System.in);
n1 = scanner.nextInt();
long startTime=System.currentTimeMillis(); //获取开始时间
s(n1 ,0);
long endTime=System.currentTimeMillis(); //获取结束时间
System.out.println("程序运行时间:"+(endTime-startTime)+"ms");
System.out.println("一共有多少种"+count);
}
}
截图代码
思路学习的mooc课程程序设计与算法(二)算法基础(郭炜老师),
学好算法,走遍天下都不怕,仅此激励自己不断学习