user-0 提问: 全排列和子集

回复:
user: user-1
content: 引用 4 楼 zhao4zhong1 的回复:仅供参考//qplw.cpp #include <stdio.h> #include <string.h> #include <stdlib.h> int v=0; int w=0; int m;//记录字符串长度 int n;//记录字符串中的字符种类数 char map[256];//记录是哪几种字符 int count[256];//记录每种字符有多少个 int stack[1000];//递归用的栈，并记录当前生成的排列 void Make_Map(char *str) {//统计字符串的相关信息     int s[256];     int i;     memset(s,0,sizeof(s));     memset(count,0,sizeof(count));     m=strlen(str);     if (w<1 || m<w) w=m;     while(*str) {         s[*str]++;         str++;     }     n=0;     for (i=0;i<256;i++)         if (s[i]) {             map[n]=i;             count[n]=s[i];             n++;         } } void Find(int depth) {//递归式回溯法生成全排列     if (depth==w) {         int i;         for (i=0;i<depth;i++) putchar(map[stack[i]]);         putchar('\n');     } else {         int i;         if (v && depth>0) {             for (i=0;i<depth;i++) putchar(map[stack[i]]);             putchar('\n');         }         for (i=0;i<n;i++)             if (count[i]) {                 stack[depth]=i;                 count[i]--;                 Find(depth+1);                 count[i]++;             }     } } void main(int argc,char**argv) {     if (argc<2) {         printf("%s 要产生全排列的字符串 [限定长度|-1]\n",argv[0]);         return;     }     if (argc>=3) w=atoi(argv[2]);     if (-1==w) v=1;     Make_Map(argv[1]);     Find(0); } //C:\test>qplw //qplw 要产生全排列的字符串 [限定长度|-1] // //C:\test>qplw 123 //123 //132 //213 //231 //312 //321 // //C:\test>qplw 123 2 //12 //13 //21 //23 //31 //32 // //C:\test>qplw 122333 3 //122 //123 //132 //133 //212 //213 //221 //223 //231 //232 //233 //312 //313 //321 //322 //323 //331 //332 //333 // //C:\test>qplw 123 -1 //1 //12 //123 //13 //132 //2 //21 //213 //23 //231 //3 //31 //312 //32 //321 //  C:\test>qplw 123456789 5 12345 12346 12347 12348 12349 12354 12356 12357 12358 12359 12364 12365 12367 12368 12369 12374 12375 12376 12378 12379 12384 12385 12386 12387 12389 12394 12395 12396 12397 12398 …… 98675 98712 98713 98714 98715 98716 98721 98723 98724 98725 98726 98731 98732 98734 98735 98736 98741 98742 98743 98745 98746 98751 98752 98753 98754 98756 98761 98762 98763 98764 98765 共15120行

user: user-2
content: 引用 7 楼 u011547107 的回复:to 5楼 && ６楼，谢谢你们！嗯，是的，简单来说，就是 从1-9这 ９个数中找出５个数的所有组合，并且这五个数是互不相同的。  洗牌算法

user: user-0
content: to 5楼 && ６楼，谢谢你们！嗯，是的，简单来说，就是 从1-9这 ９个数中找出５个数的所有组合，并且这五个数是互不相同的。

user: user-3
content: 指的是输出所有可能？

user: user-1
content: 仅供参考//qplw.cpp #include <stdio.h> #include <string.h> #include <stdlib.h> int v=0; int w=0; int m;//记录字符串长度 int n;//记录字符串中的字符种类数 char map[256];//记录是哪几种字符 int count[256];//记录每种字符有多少个 int stack[1000];//递归用的栈，并记录当前生成的排列 void Make_Map(char *str) {//统计字符串的相关信息     int s[256];     int i;     memset(s,0,sizeof(s));     memset(count,0,sizeof(count));     m=strlen(str);     if (w<1 || m<w) w=m;     while(*str) {         s[*str]++;         str++;     }     n=0;     for (i=0;i<256;i++)         if (s[i]) {             map[n]=i;             count[n]=s[i];             n++;         } } void Find(int depth) {//递归式回溯法生成全排列     if (depth==w) {         int i;         for (i=0;i<depth;i++) putchar(map[stack[i]]);         putchar('\n');     } else {         int i;         if (v && depth>0) {             for (i=0;i<depth;i++) putchar(map[stack[i]]);             putchar('\n');         }         for (i=0;i<n;i++)             if (count[i]) {                 stack[depth]=i;                 count[i]--;                 Find(depth+1);                 count[i]++;             }     } } void main(int argc,char**argv) {     if (argc<2) {         printf("%s 要产生全排列的字符串 [限定长度|-1]\n",argv[0]);         return;     }     if (argc>=3) w=atoi(argv[2]);     if (-1==w) v=1;     Make_Map(argv[1]);     Find(0); } //C:\test>qplw //qplw 要产生全排列的字符串 [限定长度|-1] // //C:\test>qplw 123 //123 //132 //213 //231 //312 //321 // //C:\test>qplw 123 2 //12 //13 //21 //23 //31 //32 // //C:\test>qplw 122333 3 //122 //123 //132 //133 //212 //213 //221 //223 //231 //232 //233 //312 //313 //321 //322 //323 //331 //332 //333 // //C:\test>qplw 123 -1 //1 //12 //123 //13 //132 //2 //21 //213 //23 //231 //3 //31 //312 //32 //321 //

user: user-0
content: @2楼，感谢你的回答！我想我应该是没有把意思说明白，要进行全排列的5个数是从1-9中随机选的。之前我自己已经写出来了全排列的程序，我的问题是如何从里面选择5个数，而且保证不会漏掉每种情况。

user: user-4
content: 我不理解你的意思？9个数随机选择5个，如何不漏掉每种情况？是指要列出从9个数中选5个的所有组合吗？ 引用 3 楼 u011547107 的回复:@2楼，感谢你的回答！我想我应该是没有把意思说明白，要进行全排列的5个数是从1-9中随机选的。之前我自己已经写出来了全排列的程序，我的问题是如何从里面选择5个数，而且保证不会漏掉每种情况。

user: user-4
content: #include <stdio.h>  int n = 0;  void swap(int *a, int *b) {     int m;     m = *a;     *a = *b;     *b = m; } void perm(int list[], int k, int m) {     int i;     if(k > m)     {         for(i = 0; i <= m; i++)             printf("%d ", list[i]);         printf("\n");         n++;     }     else     {         for(i = k; i <= m; i++)         {             swap(&list[k], &list[i]);             perm(list, k + 1, m);             swap(&list[k], &list[i]);         }     } } int main() {     int list[] = {1, 2, 3, 4, 5};     setvbuf(stdout, NULL, _IONBF, 0);     perm(list, 0, 4);     printf("total:%d\n", n);     return 0; }

user: user-5
content: 1. 从9个数中选5个，编写一个全部情况的获取程序。 2. 5个数全排列，找个算法。