BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #36876同步于 2010/3/21
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

[求助]怎样实现全排列

huangji2060
2010/3/21镜像同步6 回复
小弟刚开始学习C,请问各位大侠怎样实现全排列呢? 例如给出五个数1,2,3,4,5,然后编程输出这五个数的各种排列方式。 烦请各位大侠指教,拜谢!!
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
wks机器人#1 · 2010/3/21
5个数的全排列就是 第一个数排第一,剩下4个数的全排列 第二个数排第一,剩下4个数的全排列 第三个数排第一,剩下4个数的全排列 第四个数排第一,剩下4个数的全排列 第五个数排第一,剩下4个数的全排列 然后递归吧。 一个数的全排列是它本身。
Vampire机器人#2 · 2010/3/21
re ls…… 详见 Introductory Combinatorics第四章…… 先搞出1~n-1的全排列,然后把n在可能的n个位置上放一遍
wks机器人#3 · 2010/3/21
另外,C++可以#include <algorithm>,里面有next_permutation这样神奇的东西,很好玩。 高德纳老师的TAOCP第4卷第一册有专门讲这个算法,看看图书馆能不能借到。
mukong机器人#4 · 2010/3/21
#include<stdio.h> void print_it(int n, int arr[]); void arrange_all(int size, int arr[], int pos); int main() { int a[20] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20}; arrange_all(20, a, 0); return 0; } /**//* 函数名: void arrange_all(int size, int arr[], int pos) 描述: 打印所有排列 参数: size 要排列的数据个数 arr[] 排列存放的数组 pos 当前排列位置 */ void arrange_all(int size, int arr[], int pos) { int i, tmp; if (pos + 1== size) /**//* 如果已经排到最后 */ { print_it(size, arr); /**//* 打印数组 */ return; } for (i = pos; i < size; i++) /**//* 对当前位置后的所有位置排列*/ { tmp = arr[pos]; /**//* 交换位置 */ arr[pos] = arr[i]; arr[i] = tmp; /**//* 递归,继续后面的调用 */ arrange_all(size, arr, pos + 1); /**//* 在交换回来,保持原有的排列次序 */ tmp = arr[pos]; arr[pos] = arr[i]; arr[i] = tmp; } } void print_it(int n, int arr[]) { int i; static int cnt = 0; printf("%21d: ", ++cnt); for (i = 0; i < n; i++) printf("%4d ", arr[i]); printf(" "); } 一个简单的非递归实现 int func(int n) { int a[30]; int i, j, t; int count=0; for(i=0;i<n;i++) a[i]=i+1; for(;;) { printf("%4d: ", ++count); for(i=0;i<n;i++) printf("%d ", a[i]); printf("\n"); for(i=n-2;i>=0;i--) if(a[i]<a[i+1]) break; if(i<0) break; for(j=n-1;;j--) if(a[j]>a[i]) break; t=a[j], a[j]=a[i], a[i]=t; i++, j=n-1; while(i<j) { t=a[j], a[j]=a[i], a[i]=t; i++, j--; } } return(0); }
huangji2060机器人#5 · 2010/3/21
【 在 mukong 的大作中提到: 】 : #include<stdio.h> : void print_it(int n, int arr[]); : void arrange_all(int size, int arr[], int pos); : ................... 非常感谢啊 就需要这么直接的!
lowpitched机器人#6 · 2010/3/22
permutation 好东西