组合算法的代码,求n个字母中的所有m个字母的组合 (n>m)

arong76 2004-09-22 04:28:54
实际项目中遇到的问题,没学过什么组合算法,搞不定,望高手指点
...全文
328 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
arong76 2004-09-23
  • 打赏
  • 举报
回复
copy就能运行
arong76 2004-09-23
  • 打赏
  • 举报
回复
终于完成了,可以交差了
#include <iostream.h>
#include <list.h>

char* trimStr(char *str)
{
char *p;
p=str;
while(p[0]==' ')
p++;
return p;
}
list<char*> parseToList(char *str,char *dlm)
{
char *oneword;
list<char*> lst;
char str1[1024];
strcpy(str1,str);
char *p1;
char *p2;
char *p3;
p1=str1;
p2=p1;
while(p1)
{
p2=p1;
p1=strstr(p1,dlm);
if(p1)
{
p3=p1;
p1++;
*p3=0;
}
oneword=new char[strlen(p2)+1];
strcpy(oneword,p2);
lst.push_back(oneword);


}
return lst;
}
list<char*> strAddList(char* str,list<char*> lst)
{
list<char*> result;
char *p;
list<char*>::iterator it;
int slen=strlen(str);
for(it=lst.begin();it!=lst.end();it++)
{
p=new char[slen+strlen(*it)+2];
strcpy(p,str);
strcat(p," ");
strcat(p,*it);
result.push_back(p);
}
return result;
}
list<char*> addList(list<char*> lst1,list<char*> lst2)
{
char *p;
list<char*> result;
list<char*>::iterator it1;
for(it1=lst1.begin();it1!=lst1.end();it1++)
{
p=new char[strlen(*it1)+1];
strcpy(p,*it1);
result.push_back(p);
}
for(it1=lst2.begin();it1!=lst2.end();it1++)
{
p=new char[strlen(*it1)+1];
strcpy(p,*it1);
result.push_back(p);
}
return result;
}

list<char*> combo(char *str,int n,int m)
{
list<char*> strlst;
strlst=parseToList(str," ");
int i=strlst.size();
list<char*>::iterator it;

char *argStr;
char *oneCombo;
char *one;
char temp[10];
list<char*> result;
if(m==1)
{

for(it=strlst.begin();it!=strlst.end();it++)
{
oneCombo=new char[strlen(*it)+1];
strcpy(oneCombo,*it);
result.push_back(oneCombo);
}
return result;
}else
if(n==m)
{
one=new char[100];
one[0]=0;
for(it=strlst.begin();it!=strlst.end();it++)
{
strcat(one," ");
sprintf(temp,"%s",*it);
strcat(one,temp);
}
strcpy(one,trimStr(one));
oneCombo=new char[strlen(one)+1];
strcpy(oneCombo,one);
result.push_back(oneCombo);
return result;
}else
{
argStr=new char[1024];
argStr[0]=0;

it=strlst.begin();
for(int k=0;k<=n-m;k++)
// for(it=strlst.begin();it!=strlst.end();it++)
{ list<char*>::iterator it2;
int j=0;
it2=it;
argStr[0]=0;
for(it2++;it2!=strlst.end();it2++)
{
j++;
strcat(argStr," ");
strcat(argStr,*it2);

}
strcpy(argStr,trimStr(argStr));
list<char*> parLst;
parLst=strAddList(*it,combo(argStr,j,m-1));
result=addList(result,parLst);
it++;
}
return result;
}

}
int main(int argc, char* argv[])
{
char str1[100];
strcpy(str1,"hello world fsrong and xxf");
list<char*> lst;
list<char*>::iterator it;
lst= combo(str1,5,2);
for(it=lst.begin();it!=lst.end();it++)
cout<<*it<<endl;

cin>>str1;
return 0;
}

//---------------------------------------------------------------------------
IDqq 2004-09-22
  • 打赏
  • 举报
回复
靠,牛B啥,不过是提供一个思路给你参考,你看不上就换别的,
谁有空费半天劲给你写出来调通啊
arong76 2004-09-22
  • 打赏
  • 举报
回复
首先,当然想到的是递归,我虽然笨,但还是学过递归的,还请各位理论家们自己动手做做,没有参与就没有发言权,我想说,没有实际写代码的就闭嘴
IDqq 2004-09-22
  • 打赏
  • 举报
回复
遇到过求m个数里选出n个数的面试题,和这个差不多了。
用递归比较容易实现吧:
假设3个数里选出2个,先选出一个,问题转化为从剩下2个数中选出一个。
SelectCh(m,n,ch[]); //ch 剩下的字符
SelectCh(m-1,n-1,ch[])递归到n=1结束

这种办法比较好想,其它方法还没想好
arong76 2004-09-22
  • 打赏
  • 举报
回复
更正,字符串的长度可以求出来,即n和m可知
我试试上面的程序,不管行不行,
先谢!
arong76 2004-09-22
  • 打赏
  • 举报
回复
是要求出所有的组合结果,n和m都不是固定的(预先不知其个数),那位用递归的兄弟,你写个代码来看看,不要什么伪代码,我在学校里的时候就是搞算法的,大都是些伪码,出来做事后才知道一点用都没有.写出来能运行和写伪码算法是2码事
双杯献酒 2004-09-22
  • 打赏
  • 举报
回复
如果只是计算C(m,n)
只要学习过排列组合的同学们都会吧。
我估计楼主是要把所有组合的结果显示出来。
kobefly 2004-09-22
  • 打赏
  • 举报
回复
不是很明白
daylove 2004-09-22
  • 打赏
  • 举报
回复
不会,学习一下,
yuexialinfeng 2004-09-22
  • 打赏
  • 举报
回复
用递推的思想.
C(n,m) = n * C(n-1,m-1)
...........
C(ni,2) = ni * C(ni-1,1)
C(ni-1,1) = ni-1;
写这样的算法很简单的,高中生都会.
langziji 2004-09-22
  • 打赏
  • 举报
回复
char CS[m];
void main()
{
int n = 0;

scanft("%d", &n);
int * temp = (int *)malloc(sizeof(int) * 4);
memset(temp, 0, sizeof(int) * 4);
GetStringChar(result, temp, n);
}
char * GetStringChar(char * result, int flag[], int n)
{
int * temp = (int *)malloc(sizeof(int) * 4);
for(int i = 0; i < m; i++)
{
if(flag[i] == 0)
{
flag[i] = 1;
if(0 == n)
{
printf("%s\n",result);
continue;
}
result[strlen(result)] = CS[i];
memcpy(result, temp, sizeof(int) * 4);
GetStringChar(temp, n - 1);
result[strlen(result)] = '\0';
}
}
free(temp);
}

没有调试,楼主自己回去试试.算法不是特别好.

64,648

社区成员

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

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