首页 > 编程知识 正文

孙子算经三三数之剩二,八皇后问题

时间:2023-05-05 21:57:51 阅读:44373 作者:3415

【声明】版权所有。 欢迎转载。 请勿用于商业用途。 联系方式: feixiaoxing @163.com】

八皇后是典型的主题。 其基本要求是在一个8*8的矩阵上放置8个物体。 一个矩阵的点只能放置一个物体。 任意两点不能位于一行、一列、左斜线,当然也不能位于右斜线上。

看了这个主题,大家的第一印象是遍历,实践后发现遍历其实很难写,复杂度也很低。 除了遍历8*8*8*8*8*8*8*8*8=2^24次数据外,还需要确定各种条件,实际计算的复杂性比这更高。 其实仔细一看,这中间的很多计算其实很多时候都不需要。 为什么这么说,是因为如果我们在某一行没有可以插入的数据,那么以后的行其实就不需要考虑了。 也就是说,只有在保证以前插入的物体都是合法有效的情况下,才能进行下一个物体的插入。 徒劳的遍历只能是徒劳的工作。

那么,该怎么办呢? 其实步骤并不太难:

)在第n行中寻找可以插入的位置,中途涉及位置的正当性的判断

)2)如果没有可以插入的地方,返回

)3)如果有可以插入的位置,插入数据。 此时,判断是否是最后一行,如果是,则返回打印输出; 相反,继续进行下一行数据的搜索处理。

如果有以上步骤,就可以写代码。 老规矩,朋友们自己先试试。

a)定义全局堆栈和打印函数

静态int geightqueen [8]={0}; 静态输入计数=0; void print () {int outer; int inner; for(outer=0; outer 8; outer(for ) inner=0; inner gEightQueen[outer]; inner ) printf('* ); printf('# '; for(inner=geightqueen[outer]1; inner 8; inner ) printf('* ); printf((n ); } printf ((=================================(n ) ) ) ) ) )

intcheck_pos_valid(intloop,int value ) {int index; Int数据; for (索引=0; 索引查找; 索引({ data=geightqueen [ index ]; if(value==data )返回0; if(indexdata )==(loop value ) )返回0; if () index-data ) loop-value ) )返回0; }返回1; } b)添加位置合法性的函数判断

voideight_queen(intindex ) {int loop; for(loop=0; loop 8; loop () if ) check_pos_valid ) index,loop ) {gEightQueen[index]=loop; if(7==index ) {gCount,print ); geightqueen [索引]=0; 返回; } eight _ queen (索引1; geightqueen [索引]=0; }}} c) 八皇后遍历

)迭代递归是编程的难点,需要自己好好实践。 与其别人写100次,不如自己写

)递归时,必须注意函数return的出口

)3)递归函数中的句子顺序不随意调换

(4)递归函数中注意数据的保存和恢复

)5)还验证递归函数。 可以使用程序验证法,也可以使用其他函数的结果进行总结:

以下是完整的代码。 大家直接保存在queue.cpp上,直接编译运行就可以了。 92个盒子都可以打印。

# includeiostreamusingnamespacestd; 静态int geightqueen [8]={0}; 静态输入计数=0; void print () {int outer; int inner; for(outer=0; outer 8; outer(for ) inner=0; inner gEightQueen[outer]; inner ) printf('* ); printf('# '; for(inner=geightqueen[outer]1; inner 8; inner ) printf('* ); printf((n ); } printf ((=================================(n ) ) ) ) ) ) Int数据; for (索引=0; 索引查找; 索引({ data=geightqueen [ index ]; if(value==data )返回0; if(indexdata )==(loop value ) )返回0; if () index-data ) loop-value ) )返回0; }返回1; }voideight_queen(intindex ) {int loop; for(loop=0; loop 8; loop () if ) check_pos_valid ) index,loop ) {gEightQueen[index]=loop; if(7==index ) {gCount,print ); geightqueen [索引]=0; 返回; } eight _ queen (索引1; geightqueen [索引]=0; }}intmain(intargc,char* argv[] ) eight_queen(0); printf('total=%dn ',gCount ); 返回1; }

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