题目:输出1234的所有全排列。
深度优先方法:通过递归函数实现
#include <cstdio>
#include <algorithm>
using namespace std;
void perm(int data[], int k, int n)
{
int i;
if(k==n-1)
{
for(i=0;i<n;i++)
{
printf("%d ",data[i]);
}
printf("\n");
}
else
{
for(i=k;i<n;i++)
{
swap(data[k],data[i]);
perm(data,k+1,n);
swap(data[i],data[k]);
}
}
}
int main()
{
int i;
int data[20];
for(i=0;i<4;i++)
data[i]=i+1;
perm(data,0,4);
return 0;
}
广度优先方法:通过队列实现
#include <deque>
#include <algorithm>
using namespace std;
typedef struct DataStru
{
int data[10];//保存排列结果
int left;//假设下标0..left-1已完成排列,下标left..n未完成排列
}DS;
deque <DS> q;
int main()
{
DS d1;
int i=1,k,leftCur;
for(i=0;i<4;i++)
d1.data[i]=i+1;//初始化data内容为1,2,3,4
d1.left=0;
q.push_back(d1);
while(!q.empty())
{
d1=q.front();
q.pop_front();
if(d1.left==3)// 如果已完成排列,则输出
{
for(i=0;i<4;i++)
printf("%d ",d1.data[i]);
printf("\n");
}
else
{
leftCur=d1.left;
d1.left++;//下面会把d1放入队列,下标left已排列完,下次从下标left+1开始排列
for(k=leftCur;k<4;k++)
{
swap(d1.data[leftCur],d1.data[k]);
q.push_back(d1);//将带排列的任务加入队列,此任务的排列范围为下标从d1.left至上界
swap(d1.data[leftCur],d1.data[k]);
}
}
}
return 0;
}
程序的运行结果为: