从八皇后问题到n皇后问题(leetcode)
2016-06-02 22:41
363 查看
1. 题目:在8×8的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后不得处在同一行、同一列或者同一对角斜线上。下图中的每个黑色格子表示一个皇后,这就是一种符合条件的摆放方法。请求出总共有多少种摆法。
思路:用一个大小为n的数组path保存皇后的位置,i表示第i行,path[i]表示第i行皇后所处的列。这样,每一行都有一个皇后,即它们不处于同一行。为了保证不处于同一列,则path[i]!=path[j]。同样为了保证不处于同一对角线,则abs(i-j)!=abs(path[i]-path[j])。
递归全排列:
2. n-queens-ii
http://www.nowcoder.com/practice/00b9b6bb397949b0a56d2bc351c4cf23?tpId=46&tqId=29127&rp=5&ru=/ta/leetcode&qru=/ta/leetcode/question-ranking
深度优先搜索:
3. n-queens
深度优先搜索:
思路:用一个大小为n的数组path保存皇后的位置,i表示第i行,path[i]表示第i行皇后所处的列。这样,每一行都有一个皇后,即它们不处于同一行。为了保证不处于同一列,则path[i]!=path[j]。同样为了保证不处于同一对角线,则abs(i-j)!=abs(path[i]-path[j])。
递归全排列:
int totalNQueens(int n) { int result=0; vector<int> path; for(int i=0;i<n;++i) path.push_back(i); Permutation(result,n,path,0); return result; } void Permutation(int &result, int n, vector<int> &path, int j){ if(j==n){ if(Check(path,n)) result++; return; } for(int i=j;i<n;++i){ int temp=path[i]; path[i]=path[j]; path[j]=temp; Permutation(result,n,path,j+1);//固定住第j位,递归排列后面的j+1~n位。 temp=path[i]; path[i]=path[j]; path[j]=temp; } } bool Check(vector<int> &path, int n){ for(int i=0;i<n;++i){ for(int j=0;j<n;++j){ if(i!=j) if(abs(i-j)==abs(path[i]-path[j])) return false; } } return true; }
2. n-queens-ii
http://www.nowcoder.com/practice/00b9b6bb397949b0a56d2bc351c4cf23?tpId=46&tqId=29127&rp=5&ru=/ta/leetcode&qru=/ta/leetcode/question-ranking
深度优先搜索:
int totalNQueens(int n) { int result=0; vector<int> path; dfs(n,result,path,0); return result; } void dfs(int n, int &result, vector<int> &path, int j){ if(j==n){ ++result; return; } for(int i=0;i<n;++i){ path.push_back(i); if(Check(path,j)) dfs(n, result, path, j+1); path.pop_back();//恢复原状态 } } bool Check(vector<int> &path, int j){ for(int i=0;i<j;++i){ if(path[i]==path[j] || abs(i-j)==abs(path[i]-path[j])) return false; } return true; }
3. n-queens
深度优先搜索:
vector<vector<string> > solveNQueens(int n) { vector<vector<string> > result; vector<int> path; NQueens(n,result,path,0); return result; } void NQueens(int n, vector<vector<string> > &result, vector<int> &path, int j){ if(j==n){ vector<string> result_one; for(int i=0;i<n;++i){ string temp(n,'.'); temp[path[i]]='Q'; result_one.push_back(temp); } result.push_back(result_one); return; } for(int i=0;i<n;++i){ path.push_back(i); if(Check(path,j)) NQueens(n,result,path,j+1); path.pop_back(); } } bool Check(vector<int> &path, int j){ for(int i=0;i<j;++i){ if(path[i]==path[j] || abs(i-j)==abs(path[i]-path[j])) return false; } return true; }
相关文章推荐
- nginx配合rtmp模块搭建流服务器
- 华为机试题—把数组排成最小的数 c++
- HDUOJ 1232 (Kruscal最小生成树+并查集维护)
- 汇编学习(十二)8086汇编拾遗 (11)
- 数据挖掘建模过程
- mini2440开发板上出现unable to open rtc device (rtc0)
- Java - 计蒜客 - 整数转换成罗马数字
- IOS将字符串转换为日期时间格式
- Maven学习记录(四)--多模块开发配置
- 【Java并发编程】并发编程大合集-值得收藏
- tiny_cnn源码阅读(4)-convolutional_layer
- 学会拒绝摔倒“哭泣”,拒绝接受“溺爱”
- leetcode 74. Search a 2D Matrix-矩阵搜索|二分查找
- OC Protocol(协议)
- Java - 计蒜客 - 移除数组中的重复元素
- 8. String to Integer (atoi)
- 第十二章 测试(Testing)
- Java 虚拟机结构分析
- 35个实用find命令例子
- javax.inject.jar:依赖注入非常方便的jar包