首页 学习日记正文

N皇后问题解法二

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

N皇后问题解法二

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

1.png

1、算法设计

非递归算法:算法思想和解法一相同,用深度优先搜索,并在不满足的约束条件的情况下及时回溯。

2、代码实现(Java)

package gxr;

import java.util.Scanner;

 

public class QueenTwo {

 

static int[] a=new int[20];

static int index=0;


public static void main(String[] args) {


Scanner sc=new Scanner(System.in);

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

int n=sc.nextInt();


backdata(n);


System.out.println("“"+n+"皇后问题”的解有 "+index/n+" 个");

}

 

static void backdata(int n) {


int k;

a[1]=0;

k=1;


while(k>0)

{

a[k]=a[k]+1;

while((a[k]<=n) && (check(k)==0))//为第k个皇后搜索位置

{

a[k]=a[k]+1;

}


if(a[k]<=n)

{

if(k==n)//到这里就表示已经找到了一组满足约束的解

output(n);//输出这组解

else

{

k=k+1;//前k个皇后找到位置,继续为第k+1个皇后找到位置

a[k]=0;//下一个皇后从头开始搜索

}

}

else

{

k=k-1;//回溯过程

}

}

 

}

 

private static int check(int k) //该函数是用来判断是否满足约束条件

{

int i;

for(i=1;i<=k-1;i++)//第n个皇后与前面n-1个皇后比较

//判断是否为同一列或者同一对角线

{

if((Math.abs(a[i]-a[k])==Math.abs(i-k)) || (a[i]==a[k]))

{

return 0;

}

}


return 1;

}

 

private static void output(int n) {


int i;

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

{

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

index++;

if(index%n==0)

System.out.println();

}


}


 

}

3推演过程

1.初始图如下:n=4

a[1]=0;

2.png

2.第一步:

a[1]=1;

如图示:

3.png

5.png









 

3.步:

a[1]=1;

a[2]=1;

如图示:

6.png



7.png




8.png

4.步:

a[1]=1;

a[2]=2;

如图示:

9.png




10.png




11.png

5.步:

a[1]=1;

a[2]=3;

如图示:

12.png



13.png




14.png

6.步:

a[1]=1;

a[2]=3;

a[3]=1;

如图示:

15.png



16.png




17.png

7.步:

a[1]=1;

a[2]=3;

a[3]=4;

如图示:

23.png



18.png

8.步:

a[1]=1;

a[2]=4;

如图示:

19.png



20.png

9.步:

a[1]=1;

a[2]=4;

a[3]=1

21.png

......

继续循环搜索判断是否符合条件,一旦后继皇后位置出现都不可取时立马回溯,前继皇后位置后移,继续操作......

10.N步:

找到第一组符合约束条件的解:

a[1]=2;

a[2]=4;

a[3]=1;

a[4]=3;

24.png

4、结果显示

22.png

5、参考文献:

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



6、附件

8皇后问题解法一


N皇后问题解法三

编者:阿沐

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

阿沐QQ543206554

Loading...


打赏

评论

Music