logo资料库

回溯法之N皇后问题(C语言)..doc

第1页 / 共2页
第2页 / 共2页
资料共2页,全文预览结束
//回溯法之 N 皇后问题 当 N>10,就有点抽了~~ /*结果前 total 行每行均为一种放法,表示第 i 行摆放皇后的列位置,第 total+1 行,输出 total*/ #include #include int n,stack[100]; int void make(int { //递归搜索以 stack[l]为初结点的所有路径 //路径数 l) //存当前路径 total; //子结点个数 int i,j; if (l==n+1) { total=total+1; for(i=1;i<=n;i++) //路径数+1 printf("\n"); exit; } for (i=1;i<=n;i++) { stack[l]=i; if (!att(l,i)) make(l+1); //再无算符可用,回溯 } } printf("%-3d",stack[i]); //输出第 i 行皇后的列位置 stack[i] //回溯(若试题仅要求一条路径,则 exit 改为 halt 即可) //算符 i 作用于生成 stack[l-1]产生子状态 stack[l]; int att(int l,int i) { int k; for (k=1;k
比数学解析法低。为了改善其时效,我们可以从下述几个方面考虑优化: 1、递归时对尚待搜索的信息进行预处理,减少搜索量; 2、尽可能减少分支(解答树的次数); 3、增加约束条件,使其在保证出解的前提下尽可能“苛刻”; 4、在约束条件中设置限定搜索层次的槛值。
分享到:
收藏