18910140161

java八皇后问题回溯算法的实现

顺晟科技

2021-08-28 09:41:59

165

包算法;

公开课《皇后》

私有int n;//皇后数量

private int[]x;//当前解决方案

私长求和;//到目前为止找到的可行方案数量

私有静态int h;//记录遍历方案的序号

public Empress(){ 0

this . sum=0;//初始化方案数为1,追溯更佳方案时会增加1。

this . n=8;//问N皇后,自己定义

this . x=new int[n ^ 1];//x[i]表示女王I放在棋盘行的x[i]列

h=1;//这是我定义的一个额外变量,用来遍历方案的个数。请看backTrace()中h变量的作用,这里定义为静态静态变量

}

公共布尔场所(int k){ 0

for(int j=1;j k;j ){

//这主要是刷符合皇后条件的解,因为皇后可以攻击同一行列或同一对角线上的棋子

if((math . ABS(k-j))==(math . ABS(x[j]-x[k]))| |(x[j]==x[k])(

返回false//如果是同一行列或同一对角线上的棋子,返回false

}

}

返回真;//如果不是同一行、同一列、同一对角线上的棋子,返回true

}

public void backTrace(int t){ 0

If (tn){//当tn发生时,算法搜索叶节点,得到一个新的N皇后无攻击布局方案,方案数增加1

总和;//程序数量增加了1

system . out . println(' scheme '(h)');

打印(x);

system . out . print(' \ n-\ n ');//华丽的分界线

}else {//当t=n时,当前扩展节点z是解空间中的内部节点,其x[i]=1,2,n,共n个子节点。

//对于当前扩展节点z的每个子节点,通过place()方法检测可行性,

//并以深度优先的方式递归搜索可行子树,或者去掉不可行的子数

for(int I=1;i=

x[t]=I;

If (place (t)){//检查节点是否满足条件

回溯追踪(t1);//递归调用

}

}

}

}

Public void print (int[] a){//打印数组,没什么

for(int I=1;一.长度;I){ 0

system . out . print(' I '行中的' Queen' I ',' a[i]'列,);

}

}

公共静态void main(String[]args){ 0

娘娘em=新娘娘();

em . back trace(1);//从1返回

系统。out . println(' \ n详细方案如上,可行数''为: ' em . sum);

}

}/*output:八后妃问题只有92种解法,这里只给出其中的三种

方案1

皇后1在1行1列,皇后2在2行5列,皇后3在3行8列,皇后4在4行6列,皇后6在6行7列,皇后7在7行2列,皇后8在8行4列,

-

备选方案2

皇后1在1行1列,皇后2在2行6列,皇后3在3行8列,皇后4在4行3列,皇后5在5行7列,皇后6在6行4列,皇后7在7行2列,皇后8在8行5列,

-。。

方案92

皇后1在1行8列,皇后2在2行4列,皇后3在3行1列,皇后4在4行3列,皇后5在5行6列,皇后6在6行2列,皇后7在7行7列,皇后8在8行5列,

-

*///~

相关文章
我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航