八皇后全部解及指定皇后位置求解
来源:互联网 发布:ubuntu ndk 编辑:程序博客网 时间:2024/05/16 07:34
编译器 VS2010
编写者 冬虫
2012.2.29
这里借助STL的向量,通过封装类Board(棋盘)实现实现了八皇后的求解问题。
1、提供了两种方式求解(1)求出八皇后的所有解(int FindAllSolution(); 共92种);(2)指定第一个皇后所在位置求解( bool Queens(int row, int col); );
2、使用接口函数void Draw();在屏幕上以棋盘形式输出每次求解结果;
3、若使用同一个Board对象多次求解,每次需调用接口函数void clearsolution();清空解空间;
核心代码如下
//eightqueen.hclass Board {public:Board();~Board();void clearsolution();int FindAllSolution();//search for all the solutions for the eight queen problembool Queens(int row, int col);//find all the solutions with the position of the first queen specifiedvoid Draw();//output the solutionsprivate:void clear();//clear the chessboardvoid Load(const std::vector<int> &queen);//load the solution to the chessboardbool Queenpos(vector<int> &queen, int col, int cur_col);bool ifsafe(int row, int col, const int pre_col, const vector<int> &queen);vector < vector<int> > m_queen;//store all the solutionschar m_item[8][8];//display the chessboard};
//eightqueen.cpp#include "eightqueen.h"Board::Board(){memset(m_item, '-', 64*sizeof(char) );}Board::~Board(){}void Board::clearsolution(){m_queen.clear();}int Board::FindAllSolution() {int i=0;while(i<8) Queens(0, i++);Draw();return m_queen.size();}bool Board::Queens(int row, int col) {vector<int> queen(8);queen[col]=row;Queenpos(queen, 0, col);if(!m_queen.empty()) return true;return false;}void Board::Draw() {int i, j, k=0;vector<int> queen;while( k< (int) m_queen.size() ){queen=m_queen[k];clear();Load(queen);cout<<"solution "<<k+1<<endl;cout<<" 0 1 2 3 4 5 6 7"<<endl;for(i=0; i<8; ++i){cout<<i<<" ";for(j=0; j<8; ++j) cout<<m_item[i][j]<<ends<<ends;cout<<endl;}++k;}}void Board::clear(){memset(m_item, '-', 64*sizeof(char) );}void Board::Load(const vector<int> &queen){int row;for(int i=0; i<8; ++i) {row=queen[i];m_item[row][i]='Q';}}bool Board::ifsafe(int row, int col, const int pre_col, const vector<int> &queen) {for(int i=0; i<col; ++i) {if(queen[i]==row) return false;//same row, no possibility in same columnelse if(i+queen[i]==col+row || i-queen[i]==col-row) return false;//same diagonalelse continue;}if(col<pre_col){if(queen[pre_col]==row) return false;//same row, no possibility in same columnelse if(pre_col+queen[pre_col]==col+row || pre_col-queen[pre_col]==col-row) return false;//same diagonalelse {};}return true;}bool Board::Queenpos(vector<int> &queen, int col, const int pre_col){if(col==pre_col) ++col;bool solved=false;if(col==8) solved=true;else{int row=0;while(row<8) {if( ifsafe(row, col, pre_col, queen) ) {queen[col]=row;solved=Queenpos(queen, col+1, pre_col);if( !solved ) ++row;else {solved=false;m_queen.push_back(queen);++row;}}else ++row;}}return solved;}
- 八皇后全部解及指定皇后位置求解
- 八皇后问题的求解代码和全部解
- 八皇后问题求解
- 求解八皇后问题
- 八皇后问题求解
- 八皇后问题求解
- 八皇后问题求解
- 八皇后问题求解
- 八皇后递归求解
- 八皇后问题求解
- 八皇后求解
- 递归求解八皇后
- 八皇后问题求解
- 八皇后、N皇后问题的求解。
- C#递归求解八皇后
- 八皇后问题求解1
- 八皇后问题求解2
- 八皇后求解(转)
- Hadoop常见问题及解决办法
- 并发包中关于CountDownLatch类的使用
- TFS2010中加载Visual Studio Scrum 1.0过程模板可能遇到的问题
- 如何在windows下处理需要通过unix的zcat命令合并的split文件?
- u-boot启动流程
- 八皇后全部解及指定皇后位置求解
- numa ksm 及Winguest相关
- 重构1:梳理并分解混乱的继承体系
- http://acm.hdu.edu.cn/showproblem.php?pid=1394
- 视频码率,帧率和分辨率的联系与区别
- 2012.2.29 linux学习笔记 gcc makefile的使用
- Oracle 排除表导出
- 堆和栈的区别 (转贴)
- DWZ框架分页和搜索功能