N-Queens
2016-04-07 16:52
274 查看
本题是八皇后问题的拓展,八皇后问题解法是一个经典的回溯算法。实际上是一个深度优先算法。在一个N*N的棋盘上,每一行有且仅有一个皇后,所以N个皇后的坐标可以用一个N元的容器
代码如下:
vector<int> colms(n)存放,其中第i行上的皇后的列位置是colms[i]。然后我们深度优先的依次找到满足要求的这n个colms。当我们进行到第r行时,首先在第r行寻找一列位置c,使得在该位置放置皇后后,与之前0~r-1行上已有的皇后不冲突。那么暂且将皇后放置到该位置上,然后递归向下搜索第r+1行,如果找到这n个colms(即r达到n),那么这n个colms位置肯定是可以的。再返回到第r行,再看第r行第c列后面是否有 同样满足的情况。
代码如下:
//判断第r行第c列位置为皇后时,是否与之前r-1行上的皇后冲突 bool checkNoAttack(vector<int> & colms,int r,int c) { for(int i=0;i<r;++i) { if(colms[i]==c||colms[i]+r==c+i||colms[i]-r==c-i) return false; } return true; } //将每一个格局的棋盘保存成string组 vector<string> chessBoardString(vector<int>& colms) { vector<string> ret; int n = colms.size(); for(int i=0;i<n;++i) { string lineString = ""; for(int j=0;j<n;++j) { lineString+=(j==colms[i]?'Q':'.'); } ret.push_back(lineString); } return ret; } //搜索第i行,DFS算法 void NQueen(vector<int> & colms,int r,vector<vector<string>> &ret) { for(int c = 0;c<colms.size();++c) { if(checkNoAttack(colms,r,c)) { colms[r]=c; if(r==colms.size()-1) { ret.push_back(chessBoardString(colms)); return; } NQueen(colms,r+1,ret); } } } vector<vector<string>> solveNQueens(int n) { vector<int> colms(n,0); vector<vector<string>> ret; NQueen(colms,0,ret); return ret; }
相关文章推荐
- UIBarButtonItem系统默认风格形状
- 菜鸟成长记-QQ列表展示、UITableView强化
- [LigerUI]使用记录
- Java调用XML的方法:DocumentBuilderFactory
- arduino红外测距模块点亮一个LED灯
- Android系统开发之五:多线程编程详解(Handler ,Looper , Message , MessageQueue)
- 深度评测xcgui
- hdu 【4198】Quick out of the Harbour
- UITableView侧滑添加多个效果以及修改颜色
- UIImagePickerController 浅析
- 工程中报错或者警告一些情况及解决办法。例如:does not contain bitcode. You must rebuild it with bitcode enabled
- Errors running builder 'DeploymentBuilder' on project_java
- ueditor
- 解决:Failed to create 'build\outputs\apk\watch-debug-unaligned.apks': 拒绝访问。
- 你真的会用UITableView嘛
- 苹果官方xcode工程build设置指南
- UGUI 下拉滚动框
- 解决“Dynamic Web Module 3.0 requires Java 1.6 or newer.”错误
- 优化UITableViewCell高度计算的那些事
- UITableViewCell高度自适应探索--AutoLayout结合Frame