【声明】版权所有。 欢迎转载。 请勿用于商业用途。 联系方式: 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; }