八皇后问题的递归算法和非递归算法实现
2015-06-18 22:40
337 查看
最近我研究了一下八皇后的问题,分别用递归算法和非递归算法实现了问题求解过程。在此,分享给大家,希望提出你的意见。
递归算法比较容易理解,在非递归算法中,需要特别注意next的用法,它用来记录下一次迭代的起点。非递归算法的本质就是使用栈结构来实现递归,从程序执行效率上来看,非递归算法略高于递归算法。
// EightQueens.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include<iostream> #include<algorithm> #include<Windows.h> using namespace std; #define N_QUEENS 8 int total = 0; int xPos[ N_QUEENS + 1 ] = { 0 }; bool IsPosOk ( int k, int j, int *x ) { if( k <= 0 || k >N_QUEENS || j <= 0 || j >N_QUEENS || x == nullptr ) { return false; } for( int i = 1; i < k; i++ ) { if( ( j == x[i] ) || ( abs( k - i ) == abs( j - x[i] ) ) ) { return false; } } return true; } void Iterate( void ) { int k = 1; int next = 1; while( k >0 ) { int j = 1; for( j = next; j <= N_QUEENS; j++ ) { if( IsPosOk( k, j, xPos ) == true ) { xPos[k] = j; break; } } if( j <= N_QUEENS ) { if( k == N_QUEENS ) { for( int i = 1; i <= N_QUEENS; i++ ) { cout<<" "<<xPos[i]; } cout<<endl; total++; next = j + 1; } else { k++; xPos[k] = 0; next = 1; } } else { xPos[k] = 0; k--; next = xPos[k] + 1; } } } void BackTrace( int k ) { for( int j = 1; j <= N_QUEENS; ++j ) { if( IsPosOk( k, j, xPos ) == true ) { xPos[k] = j; if( k == N_QUEENS ) { total++; for( int i = 1; i <= N_QUEENS; i++ ) { cout<<" "<<xPos[i]; } cout<<endl; return; } else { BackTrace( k + 1 ); } } xPos[k] = 0; } } int main( void ) { cout<<"Eight Queens' Solutions are:"<<endl; int iTick = GetTickCount(); BackTrace( 1 ); cout<<"Total Solution1 is "<<total<<endl; cout<<"Solution1 Elapse : "<<GetTickCount() - iTick<<endl; total = 0; iTick = GetTickCount(); Iterate(); cout<<"Total Solution2 is "<<total<<endl; cout<<"Solution2 Elapse : "<<GetTickCount() - iTick<<endl; getchar(); return 0; }
递归算法比较容易理解,在非递归算法中,需要特别注意next的用法,它用来记录下一次迭代的起点。非递归算法的本质就是使用栈结构来实现递归,从程序执行效率上来看,非递归算法略高于递归算法。
相关文章推荐
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- C#数据结构与算法揭秘二
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析
- C#常见算法面试题小结
- JavaScript 组件之旅(二)编码实现和算法
- PHP排序算法类实例