首页 > 编程知识 正文

八皇后问题递归算法思想,八皇后问题最简单算法

时间:2023-05-04 08:30:37 阅读:44375 作者:2378

文章目录主题描述思路分析回顾溯源法的基本框架,将解题框架应用于正题定义问题的解空间定义约束函数中,仿照溯源法框架解题实现源代码分析和总结

主题是在88格的棋盘上放置8个相互不受攻击的皇后。 国际象棋规则:皇后可以攻击同一行或同一列或同一斜线的棋子

构想分析八皇后问题,等效于将八皇后放在8*8格棋盘上。 任何两个jddbg都不应在同一行或同一列或同一对角线上回顾回溯法的基本框架,首先定义问题的解空间。 给出问题的所有解和最优解。 我理解的是用另一种可编程的形式表达问题。 决定容易搜索的解空间构造:子集树这两种树构造。 问题是从n个要素的集合中找出满足性质的k个要素的集合,是组合问题数组树。 确定满足n个要素某一性质的序列,使用序列树。 有两种方法可以确定约束函数。 一个是约束函数,另一个是边界函数约束函数,在扩展节点中减去不满足约束的子树。 边界函数,减去得不到最优解的子树。 从根节点开始按深度优先搜索解空间树,算法搜索空间树的任意一点。 将解题框架应用于主题定义问题的解空间定义解空间,采用可编程的形式定义问题。 将问题转换为的一维数组表示。 值表示对应的列,位顺序表示行。

如果我没读过教科书,我默认使用二维数组而不是数组来解决这个问题。 使用二维数组会产生很多问题。 定义约束函数主要有三个。 斜线因行而异

模仿回溯法框架解决问题的语音回溯(intt ) if (TN ) output(x ) x ); elsefor(intI=f ) n,t ); I=g(n,t ); I ) x[t]=h(I ); if (约束(t )绑定(t ) t ) )后台(t1; }t表示递归深度,n表示最大递归深度。 同样,控制层数output(x ) :表示在输出可执行解xfor循环遍历的起点和终点满足限制之前,不执行以下迭代来实现源代码: # includeiostreamusingnamespacestd; //为了表示问题,定义一维数组,在递归过程中可以操作,所以必须是全局变量//这里定义9个,第一个不能使用。 索引为零输入队列[9]; //定义保存所有八皇后数int total=0的total变量/*说明:约束函数,传递的当前状态为条件参数: row,行号返回:判断当前位置是否能被皇后理解:给我行号就索引获取相应列号以确定前几个皇后的位置是否与当前皇后的位置冲突*/boolconstrain(introw ) ) for(inti=i row; I () if ) queen[I]==queen[row]|ABS ) row-I )==ABS ) queen[row]-queen[I] ) /相等,则立即返回falseretuuuure (/)描述:回溯法递归选项,递归实现树结构的扫描参数) n树的阶数也是递归深度,皇后数也是无行号返回值,仅递归描述)递归传递的参数必须递归终止的条件参数I ) {cout queen[i] '; }cout endl; //在下一列递归结束的条件if(row==9) {total; (else(/列中重复的条件for ) intcol=1; col 9; col )//在改变当前状态的第//row行的第col列中,对应的queen[row]=col; //只要传递当前环境是否满足约束条件的//行号,如果当前状态if(constrain(row ) ) /满足条件,则返回下一个递归recursive (row1); }}}intmain(intargc,char const* argv[] ) (/从第1行的第1列到recursive(1)1); 计数总结尾; int a; cin a; 返回0; }这是回溯算法的简单应用,是一个很好的尝试! 回溯算法还很普遍!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。