C++搜索与回溯算法之全排列问题

全排列问题:设有n个整数的集合{1,2,…,n},从中任意取出r个数进行排列(r),试列出所有的排列。

可以用枚举,就像这样(当r=5时):

 

#include
int n,i[5],r=5;
bool mark(int x[],int y)
{
	for(int j=0;j

但是,r是个变量,所以要用回溯法:

#include
int n,r,num[10000];
bool mark[10000]; //判断该数是否使用过的数组
void print()
{
	for(int i=1;i<=r;i++)
		printf("%d ",num[i]);
	printf("\n");
}
void search(int x)       //回溯过程
{
	for(int i=1;i<=n;i++)
		if(!mark[i])   //判断该数是否使用过
		{
			num[x]=i;   //存储结果
			mark[i]=true; //标记该数
			if(x==r) print(); //判断是否已有r个数,输出
			search(x+1);
			mark[i]=false; //回溯
		}
}
int main()
{
	scanf("%d%d",&n,&r);
	search(1);
}

 


你可能感兴趣的:(深度优先搜索,C++学习日志,搜索算法刷题集锦)