careercup-递归和动态规划 9.9
2014-12-08 13:24
381 查看
9.9 设计一种算法,打印八皇后在8*8棋盘上的各种摆法,其中每个皇后都不同行、不同列,也不在对角线上。这里的“对角线”指的是所有的对角线,不只是平分整个棋盘的那两条对角线。
类似leetcode:N-Queens
回溯法的实现代码:
类似leetcode:N-Queens
回溯法的实现代码:
#include<vector> #include<iostream> #include<string> using namespace std; bool isValid(vector<string> &path,int row,int col) { int i,j; for(j=0;j<row;j++) if(path[j][col]=='Q') return false; //由于不一定是主对角线和副对角线上的点,所以i和j的初值不能从0或者最后一个点赋值 for(i=row-1,j=col-1;i>=0&&j>=0;i--,j--) if(path[i][j]=='Q') return false; for(i=row-1,j=col+1;i>=0&&j<(int)path.size();i--,j++) if(path[i][j]=='Q') return false; return true; } void helper(int n,int start,vector<vector<string> > &res,vector<string> &path) { if(start==n) { res.push_back(path); return; } int j; for(j=0;j<n;j++) { if(isValid(path,start,j)) { path[start][j]='Q'; helper(n,start+1,res,path); path[start][j]='.'; } } } vector<vector<string> > NQueue(int n) { vector<vector<string> > res; vector<string> str(n,string(n,'.')); helper(n,0,res,str); return res; } int main() { vector<vector<string> > result=NQueue(4); for(auto a:result) { for(auto t:a) cout<<t<<endl; cout<<endl; } }
相关文章推荐
- 程序员面试金典: 9.9 递归和动态规划 9.3魔术索引
- 程序员面试金典: 9.9 递归和动态规划 9.6打印n对括号的全部有效组合
- 程序员面试金典: 9.9 递归和动态规划 9.10求堆出箱子的最大高度
- careercup-递归和动态规划 9.1
- 9.9递归和动态规划(七)——实现很多图片编辑软件都支持的“填充颜色”功能
- 9.9递归和动态规划(一)——小孩上楼梯的方式的种类
- 9.9递归和动态规划(四)——返回某集合的所有子集
- 9.9递归和动态规划(六)——打印n对括号的所有有效组合(即左右括号正确配对)
- careercup-递归和动态规划 9.2
- 9.9递归和动态规划(九)——N皇后
- 9.9递归和动态规划(二)——有个机器人坐在X*Y网格的左上角,只能向右、向下移动,机器人从(0,0)到(X,Y)有多少种走法
- 9.9递归和动态规划(九)——N皇后
- 9.9递归和动态规划(三)——魔术索引
- 9.9递归和动态规划(十)——堆箱子
- 程序员面试金典: 9.9 递归和动态规划 9.7颜色填充
- 程序员面试金典: 9.9 递归和动态规划 9.11求布尔表达式的表达个数
- careercup-递归和动态规划 9.3
- 程序员面试金典: 9.9 递归和动态规划 9.4求某集合的所有子集
- 9.9递归和动态规划(六)——打印n对括号的全部有效组合(即左右括号正确配对)
- 程序员面试金典: 9.9 递归和动态规划 9.8求n分可以由25分,10分,5分,1分的硬币的表示方法