如何用C++实现排列组合

wike119 2013-04-26 03:46:27
我有5组相同的数组,比如每组都是123,如何用C++实现全部的排列组合,比如,5组123中,排列为11111,12111,12211等等。
最好是有C++可执行源码。
...全文
1544 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2013-04-27
  • 打赏
  • 举报
回复
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门! 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出 qpl.cpp:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
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;
        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 要产生全排列的字符串 [限定长度]\n",argv[0]);
        return;
    }
	if (argc>=3) w=atoi(argv[2]);
    Make_Map(argv[1]);
    Find(0);
}
//qpl 112233 2
//11
//12
//13
//21
//22
//23
//31
//32
//33
gavinli1991 2013-04-26
  • 打赏
  • 举报
回复
用深搜来暴力枚举,然后用hash来剪枝,差不多了,如果有数字相同的,就再用个hash去重
buyong 2013-04-26
  • 打赏
  • 举报
回复
用多重循环肯定可以实现
niefanliyang 2013-04-26
  • 打赏
  • 举报
回复
可以使用矩阵啊
wike119 2013-04-26
  • 打赏
  • 举报
回复
要的不是全排列。 比如,2组123中,排列个数为2^3=9个, 为11,12,13,21,22,23,31,32,33。
赵4老师 2013-04-26
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
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);
    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==m) {
        int i;
        for (i=0;i<depth;i++) putchar(map[stack[i]]);
        putchar('\n');
    } else {
        int i;
        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 要产生全排列的字符串\n",argv[0]);
        return;
    }
    Make_Map(argv[1]);
    Find(0);
}
#include <stdio.h>
#include <stdlib.h>
#define MAX_NUM 26
int comb[MAX_NUM];
int c1,c2;
void combination(int m,int n) {
    int i,j;

    for (i=m;i>=n;i--) {
        comb[n]=i; /* 选择当前的“头”元素 */
        if (n>1) {
            combination(i-1,n-1); /* 进入下一次更小的组合问题 */
        } else { /* 满了需要的组合数,输出 */
            for (j=comb[0];j>0;j--) printf("%c",'A'+c1-comb[j]);
            printf("\n");
        }
    }
    return;
}
int main(int argc,char **argv) {
    if (argc<3) {
        printf("%s 组合下标 组合上标\n",argv[0]);
        return 1;
    }
    c1=atoi(argv[1]);
    if (c1<1 || MAX_NUM<c1) {
        printf("1<=组合下标<=%d\n",MAX_NUM);
        return 2;
    }
    c2=atoi(argv[2]);
    if (c2<1 || c1<c2) {
        printf("1<=组合上标<=组合下标\n");
        return 3;
    }
    comb[0]=c2;
    combination(c1,c2);
    return 0;
}
wike119 2013-04-26
  • 打赏
  • 举报
回复
其中,比如有n组,每组m个相同的值,排列出来的组数是m^n个。

65,184

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧