首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

给出一个字符集和数目n,输出该字符集在该数目下的组合。解决思路

2012-03-29 
给出一个字符集和数目n,输出该字符集在该数目下的组合。例如:字符集 (p, o), n 3,所以输出是:ppp, ppo, p

给出一个字符集和数目n,输出该字符集在该数目下的组合。
例如:
字符集 (p, o), n = 3,所以输出是:
ppp, ppo, poo, pop, opp, opo, oop, ooo

当然也可能是这样 字符集是(p, o), n = 2 (这个我想大家应该都知道怎么算了)



[解决办法]
用递归方法实现,lz有兴趣可以改成用栈的。

C/C++ code
#include <stdio.h>#include <string.h>void print_all( char* set, int set_size, int len, int depth, char result[] ){    if( len <= 0 || set_size <= 0 || depth < 0 ) { return; }    if( depth == len ) { puts( result ); return; }    for( int i = 0; i < set_size; ++i ) { result[depth] = set[i]; print_all( set, set_size, len, depth + 1, result ); }}int main(){    char* set = "po";    int   len = 3;    char* result = new char[len + 1];    result[len] = 0;     print_all( set, strlen( set ), len, 0, result );    delete[] result;    return 0;}
[解决办法]
用集合的长度做进制
如本题 {o,p} 就用2进制
n=3
所以从 0(000) 到 7(111)循环输出
把输出的字符串映射出来就行
o--0
p--1
000 --- ooo
001 --- oop
010 --- opo
011 --- opp
100 --- poo
101 --- pop
110 --- ppo
111 --- ppp
其他进制同理
[解决办法]
假设字符集的个数为m个,输出的长度为n
比如:
字符集 (p, o), n = 3,
这里,m = 2; n = 3;
取值是ppp, ppo, poo, pop, opp, opo, oop, ooo

其实就是n层循环,每层循环m种取值,也就是共有m的n次方种组合情况
因为n是变量,所以无法直接写n层循环,但是可以使用递归和回溯来替代循环
2楼给出的是递归方法,下面是使用回溯的方法,执行过程完全一样
C/C++ code
#include<iostream>using namespace std;void func(const char *str, const int len, int num){    int cur = 0;    char *table = new char[num];    table[0] = -1;    while (cur >= 0)    {        table[cur] += 1;        if (table[cur] < len)        {            if (num - 1 == cur)            {                int i;                for (i = 0; i < num; ++i)                {                    cout<<str[table[i]];                }                cout<<endl;            }            else            {                cur += 1;                table[cur] = -1;            }        }        else        {            cur -= 1;        }    }    delete[]table;}int main(){        const char *p = "opq";    func(p, strlen(p), 4);        system("pause");    return 0;}
[解决办法]
/**
 * c-code
 * 位运算
 */
#include <stdio.h>
#include <math.h>

void main()
{
int n=1,count,flag;
char *ch = "op";//字符集
while(n!=0)//当输入n=0时结束
{
printf("input n:");
scanf("%d",&n);
count=0;
while( count != (int)pow(2,n) )//输出的结果有2的n次方种可能,从0到2^n-1
{
flag = n;
while(flag!=0)//从2^n-1到0位,逐步检测
{
--flag ;
if( ( count & (int)pow(2,flag) ) == (int)pow(2,flag))
//为1,输出'o’
putchar(ch[0]);
else
//为0,输出'p’
putchar(ch[1]);
}
count++;
putchar(' ');
}
putchar('\n');
}
}
/*
例如:n=3时
有000,001,010,011,100,101,110,111这2^3种可能,对应
有ppp,ppo,pop,poo,opp,opo,oop,ooo
*/
[解决办法]
C/C++ code
char ch[] = {'p', 'o'};int length = 2;int num =3;void fun2(vector<char> v, int count){    if(count > num)    {        return;    }    else if(count == num)    {        for(int i = 0; i < v.size(); i++)            cout<<v[i]<<" ";        cout<<endl;    }    else    {        for(int i = 0; i < length; i++)        {            v.push_back(ch[i]);            fun2(v, count+1);            v.pop_back();        }    }}void main(){    vector<char> v;    fun2(v, 0);    getchar();} 

热点排行