回溯之全排列

版权声明:写的不对不好的地方希望大家能“狠狠地”指出来:) https://blog.csdn.net/qq_37006625/article/details/84930849

全排列

问题描述:

输入一个数n,输出从1~n的全排列

样例输入

3

样例输出

123 132
213 231
321 312

回溯法

完全没有限制的排列,那便也用不到剪枝函数

代码

/*
全排列 
*/
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>

using namespace std;

#define MAX_N 10

static int a[MAX_N];
static int flag1 = 0;
static int flag2 = 0;
static int nn;

void print()
{
	if(flag1 == 0) ;
	else cout <<" ";
	for(int i = 0;i < nn;i ++ ){
		cout << a[i];
	}
}

void dfs(int n)
{
	if(n==1){
		if(flag2!=0)
		cout << endl;
		flag1 = 0;
		flag2++;
		
	}
	if(n == nn){
		print();
		flag1++;
		return;
	}
		
	else{
		for(int i = n;i < nn;i ++ ){
			swap(a[n],a[i]);
			dfs(n+1);
			swap(a[i],a[n]);
		}
	}
	return;
}

int main()
{
	int n;
	while(cin >> nn,nn){
		memset(a,0,MAX_N);
		for(int i = 0;i < nn;i ++ ){
		a[i] = i+1;
		}
		dfs(0);
		cout << endl;
		flag2 = 0;
	}
	return 0;
 } 

猜你喜欢

转载自blog.csdn.net/qq_37006625/article/details/84930849