c++排列组合问题

风尘流月 2011-11-04 09:49:05
怎样用c++实现集合元素中任意个数元素的排列组合。。
...全文
313 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2011-11-04
  • 打赏
  • 举报
回复
#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", 65+c1-comb[j]);
}
printf("\n");
}
}
return;
}
int main(int argc, char *argv[])
{
if (argc<3) {
printf("%s 组合下标 组合上标\n",argv[0]);
return 0;
}
c1=atoi(argv[1]);
if (c1<1||26<c1) {
printf("1<=组合下标<=26\n");
return 0;
}
c2=atoi(argv[2]);
if (c2<1||c1<c2) {
printf("1<=组合上标<=组合下标\n");
return 0;
}
comb[0]=c2;
combination(c1, c2); /* C(4, 2) */
return 0;
}
风尘流月 2011-11-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 qq120848369 的回复:]

你到底是要排列还是组合.
[/Quote]两个都要
qq120848369 2011-11-04
  • 打赏
  • 举报
回复
你到底是要排列还是组合.
对象 2011-11-04
  • 打赏
  • 举报
回复
典型的递归回溯问题。
赵4老师 2011-11-04
  • 打赏
  • 举报
回复
仅供参考
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
int i;
int L;
void main(int argc,char **argv) {
if (argc<2) {
printf("%s 要排列的字符串\n",argv[0]);
return;
}
L=strlen(argv[1]);
vector<char> P(L);
vector<char>::iterator b,e,it;
b=P.begin();
e=P.end();
for (i=0;i<L;i++) P[i]=argv[1][i];
sort(b,e);
i=0;
do {
printf("%10d: ",++i);
for(it=b;it!=e;it++) printf("%c",*it);
printf("\n");
} while (next_permutation(b,e));
printf("The total: %d",i);
}
stackoverlow 2011-11-04
  • 打赏
  • 举报
回复
标记下,学习学习
gl378591432 2011-11-04
  • 打赏
  • 举报
回复

/**************************************************************/
/* 函数名称: 字符排列 */
/* 函数功能: 用已知字符串s中的字符,生成由其中n个字符组成的所有*/
/* 字符排列,设n小于字符串s的字符个数,其中s中的字符在*/
/* 每个排列中最多出现一次. */
/* 算法分析: 采用递归方法生成字符排列. */
/**************************************************************/
#include "stdio.h"
#include "conio.h"
#include "stdlib.h"
#include "string.h"
#define N 20
char w[N];
void Perm(int n,char *s)
{
char s1[N];
int i;
if(n<1)
printf(" %s\n",w);//一个排列生成输出
else
{
strcpy(s1,s);//保存本层可使用的字符
for(i=0;*(s1+i);i++)//依次选本层可用的字符
{
*(w+n-1)=*(s1+i);//将选用字符填入正在生成的字符排列中
*(s1+i)=*s1;
*s1=*(w+n-1);
Perm(n-1,s1+1);//递归
}
}
}//Perm()

void main()
{
int n=2;
char s[N];
w[n]='\0';
system("cls");
printf("==================字符替换=====================\n");
printf("输入字符串: ");
scanf("%s",s);
printf("\n请输入排列组成的字符个数: ");
scanf("%d",&n);
puts("\n字符排列组合为: \n");
Perm(n,s);
puts("\n任意键结束...\n");
getch();
}

65,210

社区成员

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

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