全排列

#include "stdio.h"

#define swap(arr, i , j)\
{\
	if ((i) != (j)) {\
	int temp;\
	temp = arr[i]; \
	arr[i] = arr[j]; \
	arr[j] = temp;\
	}\
}

void print_array(int *arr, int len)
{
	int i;
	printf("\n");
	for(i  =0; i < len; i++) {
		printf("%d ", arr[i]);
	}
}

int permutation(int *arr, int pos, int n)
{
	int i;

	if (pos == n) { //递归结束条件
		print_array(arr, n);
		return 0;
	}

	for(i = pos; i < n; i++) 
	{  
		swap(arr, i, pos);//某个数字交换到 pos 位置
		permutation(arr, pos + 1, n); //对出pos 位置后面的数,进行一次全排列
		swap(arr, i, pos);//复原原来的排列,准备交换下一个数到pos 位置。  
	}
	return 0;
}

int main(int argc, char *argv[])
{
	int n = 0;
	int i;
	int number[20]; //已经有2432902008176640000 种排列方法了,输出来也很难保存这样多的数据了,所以程序不能大于这个数字。

	printf("input n: ");
	while (scanf("%d", &n)) {
		if (n < 1) {
			printf("n must big than zero. \n");
			continue;
		}
		if (n > 20) {
			printf("n too big. \n");
			continue;
		}
		for (i = 0; i < n; i++) {
			number[i] = i + 1;
		}
		permutation(number, 0, n);
		printf("\n\ninput n: ");
	}
	return 0;
}

来至http://www.cnblogs.com/niniwzw/archive/2010/03/19/1689863.html
posted @ 2013-11-05 17:24  byfei  阅读(210)  评论(0)    收藏  举报