很早就听说过A*算法,据说在寻路径时,是一种比较高效的算法。但是一直没有搞清楚原理。 这段时间刚好有个营救公主的例子: 题描述 : 公主被魔王抓走了 , 王子需要拯救出美丽的公主 。 他进
顺晟科技
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列,
-
*///~
28
2021-08
28
2021-08
28
2021-08
28
2021-08
28
2021-08
28
2021-08