注册 登录
编程论坛 C++教室

求大神相助!用 c++ 写的关于组合排列的程序,编译和运行都没错误,就是运行的时候不出结果。谢大神们!!

lvhuayan 发布于 2014-06-18 20:11, 407 次点击
程序代码:
#include <iostream>
using namespace std;

 
#define MaxN 10

class ZUHEPAILIE{
public:
    ZUHEPAILIE();
    int choice();
    void putdata();
    void permute(int pos,int n,int r);
    void combine(int pos,int h,int n,int r);
    int n;
    int r;
    char used[MaxN];
    int p[MaxN];
    char s[MaxN];
    char str[MaxN];
};

ZUHEPAILIE::ZUHEPAILIE()
{
}

int ZUHEPAILIE::choice()
{
    int choose;
    cout<<"******************************************************************************"<<endl;
    cout<<"输入序号1则为输入"<<endl;
    cout<<"输入序号2则为组合"<<endl;
    cout<<"输入序号3则为排列: "<<endl;
    cout<<"输入除数字1、2、3之外的任意键则退出: "<<endl;
    cout<<"******************************************************************************"<<endl;
    cout<<"请输入序号进行操作: "<<endl;
    cin>>choose;
    return choose;
}

void ZUHEPAILIE::putdata()
{
    cout<<"您将输入一个长度为n(用户自定义)的字符串\n"<<"请输入字符串长度n:"<<endl;
    cin>>n;
    cout<<"请输入"<<n<<"个字母(输入时请勿输入相同字母):\n";//最多输入多少个由 MaxN 的值决定
    cin>>str;
    strcpy(s,str);
    cout<<"请输入需要操作的字母数r:\n"<<endl;
    cin>>r;
}

 
//从n个元素中选r个进行排列
void ZUHEPAILIE::permute(int pos,int n,int r)
{
    int i;
    /*如果已是第r个元素了,则可打印r个元素的排列 */
    if(pos == r)
    {
        for(i=0; i<r; i++)
            cout<<s[p[i]];
        cout<<endl;
        return;
    }
    for (i=0; i<n; i++)
    {
        if(!used[i])
        {
            /*如果第i个元素未用过*/
            /*使用第i个元素,作上已用标记,目的是使以后该元素不可用*/
            used[i]++;
            /*保存当前搜索到的第i个元素*/
            p[pos] = i;
            /*递归搜索*/
            permute(pos+1,n,r);
            /*恢复递归前的值,目的是使以后改元素可用*/
            used[i]--;
        }
    }
}

 
//从n个元素中选r个进行组合
void ZUHEPAILIE::combine(int pos,int h,int n,int r)
{
    int i;
    /*如果已选了r个元素了,则打印它们*/
    if (pos == r)
    {
        for(i=0; i<r; i++)
            cout<<s[p[i]];
        cout<<endl;
        return;
    }
    for(i=h; i<=n-r+pos; i++) /*对于所有未用的元素*/
    {
        if (!used[i])
        {
            /*把它放置在组合中*/
            p[pos] = i;
            /*使用该元素*/
            used[i]++;
            /*搜索第i+1个元素*/
            combine(pos+1,i+1,n,r);
            /*恢复递归前的值*/
            used[i]--;
        }
    }
}


 
int main()
{
    ZUHEPAILIE zuhepailie=ZUHEPAILIE();

    cout<<"                           排列组合生成器                              "<<endl;
   

    while(1)
    {
    switch(zuhepailie.choice())
   {
    case 1:cout<<"输入n个字母,和整数r (r<=n): "<<endl;
        zuhepailie.putdata();
        break;
    case 2: cout<<"n个字母中选择r个字母形成的所有组合为: "<<endl;
        (0,0,zuhepailie.n,zuhepailie.r);
        break;
    case 3: cout<<"n个字母中选择r个字母形成的所有排列为: "<<endl;
        zuhepailie.permute(0,zuhepailie.n,zuhepailie.r);
        break;
    default:   break;
   }
    }
    return 0;
}

只有本站会员才能查看附件,请 登录
1 回复
#2
maxg12062014-06-19 07:45
程序中used数组没有赋值吧?
另外combine函数和permute函数条件中的!used是不是有点问题?
1