输出所有的全排列:深度优先方法与广度优先方法

题目:输出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;
}
程序的运行结果为:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值