【問題描述】
對于給定的正整數n(n>=1),求1~n的所有全排列。
【問題求解】
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHLwcmeOh3aq5EMRpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL2gTN5ETO1YTM5ATMxkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
【算法實作(C++)】
void Insert(vector<int> s, int i, vector<vector<int>>&ps1)
//在每個集合元素中間插入i得到ps1
{
vector<int> s1;
vector<int>::iterator it;
for (int j = 0; j < i; j++)//在s(含i-1個整數)的每個位置插入i
{
s1 = s;
it = s1.begin() + j;//求出插入位置
s1.insert(it, i);//插入整數i
ps1.push_back(s1);//添加到ps1中
}
}
void Perm(int n)//求1~n的所有全排列
{
vector<vector<int>>ps1;//臨時存放子排列
vector<vector<int>>::iterator it;//全排列疊代器
vector<int> s, s1;
s.push_back(1);
ps.push_back(s);//添加{1}集合元素
for (int i = 2; i <= n; i++)//循環添加1~n
{
ps1.clear();//ps1存放插入i的結果
for (it = ps.begin(); it != ps.end(); ++it)
Insert(*it, i, ps1);//在每個集合元素中間插入i得到平時ps1
ps = ps1;
}
}