(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