您的位置:首页 > 其它

全排列

2013-11-05 17:24 127 查看
#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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: