首页 学习日记正文

N皇后问题解法三

阿沐 学习日记 2018-11-28 553 0 java学习

N皇后问题解法三

编者:16计外1 阿沐         指导老师:李老师

1、算法设计

递归算法:

相比于回溯算法,更方便地是用递归控制方式实现,用这种方式也可以解决任意的n皇后问题,算法思想和解法一二相同,用深度优先搜索,并在不满足的约束条件的情况下及时回溯。

 

设计技巧:

4个数组记录信息:

a数组记录解的正确值;

b数组记录n个列;

c数组记录2n-1个主对角线的占用情况(1为占用,0为未占用);

d数组记录2n-1个负对角线的占用情况(1为占用,0为未占用);

1.png

依旧以4阶棋盘为例:

共有2n-1=7个主对角线和7个负对角线。

i,j分别表示皇后所在的行列(或者说i号皇后在j列),同一主对角线上的行列下标的差一样,若用表达式i-j编号,则范围为-n+1-->n-1,所以表达式i-j+n对主对角线编号,范围就是1-->2n-1。同样的,负对角线上行列下标的和一样,用表达式i+j编号,则范围为2-->2n

2、代码实现(Java)

package gxr;

 

import java.util.Scanner;

 

public class QueenThree {


static int[] a=new int[20];//记录最终结果数组

static int[] b=new int[20];//记录棋盘的n个列

static int[] c=new int[40];//记录2n-1个主对角线的占用情况

static int[] d=new int[40];//记录2n-1个负对角线的占用情况

static int n;

static int t;//记录解的个数

static int i;

int j;

static int k;

 

public static void main(String[] args) {


Scanner sc=new Scanner(System.in);

System.out.println("请输入皇后个数:");

n=sc.nextInt();

for(i=1;i<=n;i++)//初始化数组

{

b[i]=0;

c[i]=0;c[n+i]=0;

d[i]=0;d[n+i]=0;

}

start(1);

 

}

 


private static void start(int i)//递归调用函数

{

int j;

for(j=1;j<=n;j++)//第i个皇后有n种可能位置

{

if((b[j]==0) && (c[i+j]==0) &&(d[i-j+n]==0))//判断位置是否冲突

{

a[i]=j;//摆放皇后

b[j]=1;//占领第j列

c[i+j]=1;//占领两对角线

d[i-j+n]=1;


if(i<n)

{

start(i+1);//n个皇后没有摆完,递归摆放下一个皇后

}else {

output();//到这里就表示已经找到了一组满足约束的解

}


b[j]=0;

c[i+j]=0;

d[i-j+n]=0;

}

}

}

 

 

private static void output()//输出解

{

t++;

System.out.print("第"+t+"组解为:");

for(k=1;k<=n;k++)

{

System.out.print(a[k]+" ");

}

System.out.println();

}

 

}

 

 

3推演过程

1. 初始图如下:

2.png

2. 第一步:

a[1]=1;

b[1]=1;

c[2]=1;

d[4]=1;

如图示:

3.png



4.png

 

5.png

3步:

a[1]=1;

b[1]=1;

c[2]=1;

d[4]=1;

a[2]=3;

b[3]=1;

c[5]=1;

d[3]=1;

如图示:

6.png

 

7.png

 

4步:

a[1]=1;

b[1]=1;

c[2]=1;

d[4]=1;

a[2]=4;

b[4]=1;

c[6]=1;

d[2]=1;

如图示:

8.png

 

9.png

5步:

a[1]=1;

b[1]=1;

c[2]=1;

d[4]=1;

a[2]=4;

b[4]=1;

c[6]=1;

d[2]=1;

 

a[3]=2;

b[3]=1;

c[5]=1;

d[5]=1;

如图示:

10.png

 

11.png

6步:

重复上面的递归循环,每当发现某次循环结束但还是没找到正确位置时,回到上层循环(也就是上层皇后右移),然后继续往下递归判断,若上层循环也结束了仍不能找到一组正确的解,那就再回到上上层循环,以此类推,直到找到正确的一组解

7N步:

a[1]=2;

a[2]=4;

a[3]=1;

a[4]=3;

b[1]=1;

b[2]=1;

b[3]=1;

b[4]=1;

c[3]=1;

c[4]=1;

c[6]=1;

c[7]=1;

d[2]=1;

d[3]=1;

d[5]=1;

d[6]=1;

 

如图示:

12.png

 

13.png

 

 

4、结果显示

14.png

 

 

5、参考文献:

算法设计与分析吕国英版(第三版)  p2108皇后问题)



6、附件

8皇后问题解法一


N皇后问题解法二

编者:阿沐

特别声明:该作品为博主原创,若发现哪里写的不对或者对哪部分不明白的请及时联系阿沐

阿沐QQ543206554

Loading...


打赏

评论

Music