首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

怎么用C++实现排列组合

2013-06-25 
如何用C++实现排列组合我有5组相同的数组,比如每组都是123,如何用C++实现全部的排列组合,比如,5组123中,排

如何用C++实现排列组合
我有5组相同的数组,比如每组都是123,如何用C++实现全部的排列组合,比如,5组123中,排列为11111,12111,12211等等。
最好是有C++可执行源码。 C++ 排列组合
[解决办法]
“给定一个小点的输入,完整单步跟踪(同时按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

热点排行