如何输出n个元素的全排列呢,比如abc,一个共有abc,acb,bac,bca,cab,cba等六种排列方式,一般来说,一个具有n个元素的串有n!中排列方式。
我们可以把n个元素的排列的生成作为一个取舍问题,例如元素串abc,对于以a开头的排列方式,可以用一下方式进行选取,(1)选择b,构成ab,
继续选择c,构成abc,新串产生结束。但是在第一步时可以不选取b,然后继续往下搜查,这时只有c,选取c,构成ac,最后一个元素才选择b,于是
又产生一个新串acb。这样就要借助一个标志数组来标记哪些元素使用过,哪些元素没有使用过。相关的参考程序如下:
Code
// ex01b.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <string>
#include <iostream>
using namespace std;
int used[100] = {0};
int total = 0;
void Perm(int n,int count,string& temp,string src)
{
if(count == n)
{
//找到一列并输出
cout<<temp<<endl;
total++;
return;
}
else
{
for(int j = 0;j < n;j++)
{
if(used[j] == 0)
{
used[j] = 1; //选上src[i],设置标记
temp += src[j];
Perm(n,count+1,temp,src);
temp.erase(temp.length()-1); //不选src[i],重置标记
used[j] = 0;
}
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
string src,temp;
cin>>src;
for(int i = 0;i < (int)src.length();i++)
{
used[i] = 1;
temp= src[i];
Perm((int)src.length(),1,temp,src);
used[i] = 0;
}
cout<<total<<" 种情况"<<endl;
return 0;
}