N-Queens && II and Permutations && II && Next Permutation
来源:互联网 发布:中南民族大学网络使用 编辑:程序博客网 时间:2024/06/08 16:26
(1) N-Queens
典型的N皇后问题[1]:
class Solution {private: void print(int *q, vector<vector<string>> &ret,int n) { vector<string> tmp; for(int i=1;i<=n;i++) { string s(n,'.'); s[q[i]-1]='Q'; tmp.push_back(s); } ret.push_back(tmp); } bool place(int k,int *q) { for(int i=1;i<k;i++) if(abs(k-i)==abs(q[k]-q[i]) || q[k]==q[i]) return false; return true; } int queen(int t,int *q,int n,int &sum,vector<vector<string>> &ret) { if(t>n && n>0) print(q,ret,n); else for(int i=1;i<=n;i++) { q[t]=i; if(place(t,q)) queen(t+1,q,n,sum,ret); } return sum; }public: vector<vector<string> > solveNQueens(int n) { int sum=0; int q[n+1]; vector<vector<string>> ret; queen(1,q,n,sum,ret); return ret; }};
class Solution {private: bool place(int k,int *q) { for(int i=1;i<k;i++) if(abs(k-i)==abs(q[k]-q[i]) || q[k]==q[i]) return false; return true; } int queen(int t,int *q,int n,int &sum) { if(t>n && n>0) sum++; else for(int i=1;i<=n;i++) { q[t]=i; if(place(t,q)) queen(t+1,q,n,sum); } return sum; } public: int totalNQueens(int n) { int sum=0; int q[n+1]; queen(1,q,n,sum); return sum; }};
(3) Permutations
两种方法:一、建立一个是否使用表[2];二、单纯交换位置[3]。
class Solution {private: void solve(int dep,vector<int> num,vector<int> &tmp,vector<vector<int>> &ret,int *sign) { int maxDep=num.size(); if(dep==maxDep) { ret.push_back(tmp); return; } for(int i=0;i<maxDep;i++) if(sign[i]==0) { sign[i]=1; tmp[dep]=num[i]; solve(dep+1,num,tmp,ret,sign); sign[i]=0; } }public: vector<vector<int> > permute(vector<int> &num) { vector<vector<int>> ret; vector<int> tmp(num.size()); int sign[num.size()]; memset(sign,0,sizeof(sign)); solve(0,num,tmp,ret,sign); return ret; }};
(4) Permutations II
交换方法[4]会显示Output Limit Exceeded错误,不知何解,还是得用是否使用表方法[5](事先得排序):
class Solution {private: void solve(int dep,vector<int> num,vector<int> &tmp,vector<vector<int>> &ret,int *sign) { int maxDep=num.size(); if(dep==maxDep) { ret.push_back(tmp); return; } for(int i=0;i<maxDep;i++) if(sign[i]==0) { if (i > 0 && num[i] == num[i-1] && sign[i-1]==0) continue; sign[i]=1; tmp[dep]=num[i]; solve(dep+1,num,tmp,ret,sign); sign[i]=0; } }public: vector<vector<int> > permuteUnique(vector<int> &num) { vector<vector<int>> ret; vector<int> tmp(num.size()); int sign[num.size()]; memset(sign,0,sizeof(sign)); sort(num.begin(), num.end());//key solve(0,num,tmp,ret,sign); return ret; }};
(5) Next Permutation
原理见[6]:
class Solution {public: void nextPermutation(vector<int> &num) { // Start typing your C/C++ solution below // DO NOT write int main() function int nSize = num.size(); if (nSize <= 1) return; int idx = nSize - 1; // 查找第一个下降的元素 while(--idx >= 0 && num[idx] >= num[idx+1]); if (idx >= 0) { int i = nSize - 1; // 查找第一个比idx所指元素大的元素 while(num[i] <= num[idx]) { --i; } swap(num[i], num[idx]); // 反转后面所有元素,让它从小到大sorted reverse(num.begin()+idx+1, num.end()); } else { reverse(num.begin(), num.end()); } }};
参考:
[1] http://blog.sina.com.cn/s/blog_696187fd0100p5ri.html
[2] http://www.2cto.com/kf/201310/251020.html
[3] http://www.cnblogs.com/panda_lin/archive/2013/11/12/permutations.html
[4] http://blog.csdn.net/xx77009833/article/details/17843415
[5] http://www.cnblogs.com/remlostime/archive/2012/11/13/2768816.html
[6] http://blog.csdn.net/pickless/article/details/9188769
0 0
- N-Queens && II and Permutations && II && Next Permutation
- [LeetCode] Next Permutation、Permutations、Permutations II、Permutation Sequence
- 【leetcode 排列组合问题】Next Permutation | Permutations | Permutations II | Permutation Sequence
- 【LeetCode】Permutations & Permutations II & Next Permutations & Permutation Sequence
- N-Queens and N-Queens II
- 46. Permutations&&47. Permutations II&31. Next Permutation
- N-Queens && N-Queens II
- Permutations and Permutations II
- LeetCode题解:N-Queens I and II
- [LeetCode]N-Queens I and II
- LintCode_190 Next Permutation II
- #190 Next Permutation II
- Next Permutation II
- LeetCode: N-Queens II
- LeetCode : N-Queens II
- [Leetcode] N-Queens II
- N-Queens II
- 【leetcode】N-Queens II
- HDOJ1203 I NEED A OFFER! --wust9 (概率背包)
- SEVERE: Servlet.service() for servlet jsp threw exception javax.el.PropertyNotFoundException: Proper
- Java字节序,java整型数与网络字节序 byte[] 数组转换关系(ByteArrayOutputStream用法)
- .NET中多线程的同步资源访问
- 面试题——写程序判断操作系统位数
- N-Queens && II and Permutations && II && Next Permutation
- 使用DatagramSocket发送、接收数据(Socket之UDP套接字)
- IE 实现自动翻译
- Ruby 一些常用的细节
- 如何提高DataGridView性能?
- NEFU 3题
- 冒泡排序算法
- androidpn学习 (一) androidpn server简单介绍
- LINUX+ORACLE 字符集 语言 相关区别:LANG NLS_LANG NLS_LANGUAGE characterset