C++编写程序,输入数n,输出n个字符的全排列,通过函数递归实现。
例如:输入3,得到a、b、c三个字符的全排列为abc,acb,bac,bca,cab,cba。...
例如:输入3,得到a、b、c三个字符的全排列为abc,acb,bac,bca,cab,cba。
展开
2个回答
展开全部
#include <string>
#include <vector>
#include <iostream>
using namespace std;
vector<string> do_permutation(string str){
vector<string> res;
if (str.size() > 1){
丛灶 for (size_t i = 0; i != str.size(); ++i){
string sub_str = str.substr(0, i) + str.substr(i + 1);
vector<string> tmp = do_permutation(sub_str);
for (size_t j = 0; j != tmp.size(); ++j){
res.push_back(str[i] + tmp[j]);
}
}
}
else{
res.push_back(str);
}
return res;
}
int main(){
size_t n;
cout << "n = ";
if (cin >> n){
string str;
for (size_t i = 0; i != n; ++i){
str += static_cast<char>('a' + i);
}
vector<string> res = do_permutation(str);
for (size_t i = 0; i != res.size(); ++i){
渗嫌扮 cout << res[i] << "\n";
}
}
else{
cerr << "输入有误\n";
者孙 }
return 0;
}
展开全部
#include <iostream>
using namespace std;
void output(char d[],int n) // 输出
{
for (int i=0;i<n;i++)
cout<<d[i];
cout<<" ";
}
void swap(char &x, char &y) //交换
{
char t = x;
x = y;
y = t;
}
void perm(char d[],int n,int j) // j起始下标
{
if (j==n)
瞎盯 磨樱和 output(d,n); // 输出
else
for (int i=j;i<n;i++) {
if (i!=j)
swap(d[j],d[i]); // 交换
颂蠢 perm(d,n,j+1); //递归求排列
if (i!=j)
swap(d[j],d[i]);} // 恢复
}
int main()
{
char a[] = {'a','b','c','d','e','f','g','h','i','j','k','l',
'm','n','o','p','q','r','s','t','u','v','w','x','y','z'};
int n;
cout<<"请输入n:\n";
cin>>n;
perm(a,n,0);
cout<<endl;
system("pause");
return 0;
}
算法:1.将第一个字符,依次与后n-1个字符交换值,每次交换得到一个新的首字母;
2.剩下的n-1个字母按1步骤重复直至所有数组完成排列;
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询