N-Queens
来源:互联网 发布:华为手机root软件 编辑:程序博客网 时间:2024/05/21 17:29
本题是八皇后问题的拓展,八皇后问题解法是一个经典的回溯算法。实际上是一个深度优先算法。在一个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;}
0 0
- N-Queens
- N-Queens
- N-Queens
- N-Queens
- N-Queens
- N-Queens
- N-Queens
- N-Queens
- N-Queens
- N-Queens
- N-Queens
- N-queens
- N-Queens
- N-Queens
- N-Queens
- N-Queens
- N-Queens
- N-Queens
- Spark应用执行机制
- CALayer的隐式动画实例 - 钟表
- 每个Xcode开发者应该知道的七个使用技巧
- Camera preview变形和MediaRecorder录制视频太短崩的问题
- 笔记(4/7)JAVA
- N-Queens
- 汇编语言(二):从键盘输入十进制数,输出该十进制数的十进制,二进制(B),十六进制(H),八进制(Q)表示
- OSI七层和TCP/IP四层网络架构
- 【opencv】多边形检测
- InputSteam源码分析
- Android动态加载Activity原理
- 随机10个数和 二
- 基于形态学分水岭的分割
- shell 循环变量传递问题