求一个算法(排列组合问题)

icank 2003-05-19 08:05:50
要求如下:
给出一个任意自定义字符数组,比如:

char DataBuf[] = {'1', '2', '3', 'a', 'b', 'c'};

函数 p(int n),求出这个数组里取 n 个数的全排列。比如 n = 5:

123ab
123ac
123ba
123bc
123ca
123cb
12a3b
12a3c
.....
.....
cba32

其实就是全排列问题,但是元素要从给出的数组里面取。
那位大虾可以给出源代码,谢谢!
...全文
386 26 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
icank 2003-05-28
  • 打赏
  • 举报
回复
mathe()的代码实现的是全排列,不符合我的要求。
mathe 2003-05-25
  • 打赏
  • 举报
回复
#include <algorithm>
#include <iostream>
use namespace std;

int main(){
char DataBuf[] = {'1', '2', '3', 'a', 'b', 'c'};
int i;
#define LENGTH (sizof(DataBuf)/sizeof(DataBuf[0]))
do{
cout<<DataBuf[0];
for(i=1;i<LENGTH;i++)cout<<','<<DataBuf[i];
}while(next_permutation(DataBuf,DataBuf+LENGTH));
}
cygandti 2003-05-25
  • 打赏
  • 举报
回复
回溯的思想对付此题比较好!
  • 打赏
  • 举报
回复
这三种方法都不要递归
  • 打赏
  • 举报
回复
建议去看看《组合数学》 卢氏兄弟 清华大学出版社
上面讲了三种方法 序数法,字典序法, 换位法
bgu 2003-05-24
  • 打赏
  • 举报
回复
这个问题用做写黑客字典不为是一个好方法!^o^
icank 2003-05-24
  • 打赏
  • 举报
回复
可以了。十分谢谢!

请问怎么给分?
flab_lwq 2003-05-23
  • 打赏
  • 举报
回复
稍微改改就可以了,应该有120个结果,排列组合一直学的不好:(
#include <stdio.h>
#include <string.h>
enum {MAX = 100};
int a[MAX]={0};
int used[MAX] = {0};
int m = 5;
char databuff[] = "123abc";
void insert(int k)
{
int i;
if(k > m) {
for (i = 1; i <= m; i++) printf("%c ", databuff[a[i] - 1]);
printf("\n");
return;
}
for( i = 1; i <= strlen(databuff) ; i++) {
if(used[i] == 0) {
a[k] = i;
used[i] = 1;
insert(k+1);
used[i] = 0;
}
}
}
void main()
{
int i;
insert(1);
}
icank 2003-05-23
  • 打赏
  • 举报
回复
flab_lwq():

你的程序是全排列,而且不是从自定义数组里面取元素,不完全符合要求。

难道这个题目就这么难吗!?
flab_lwq 2003-05-21
  • 打赏
  • 举报
回复
c下面求全排列的递归解法
#include <stdio.h>
const int MAX = 100;
int a[MAX]={0};
int used[MAX] = {0};
int n = 3;
void insert(int k)
{
int i;
if(k > n) {
for (i = 1; i <= n; i++) printf("%d ", a[i]);
printf("\n");
return;
}
for( i = 1; i <= n; i++) {
if(used[i] == 0) {
a[k] = i;
used[i] = 1;
insert(k+1);
used[i] = 0;
}
}
}
void main()
{
int i;
insert(1);
}
fiveyes 2003-05-21
  • 打赏
  • 举报
回复
给你抄一段:《数据结构算法与应用--C++语言描述》

template<class T>
void Perm(T list[], int k, int m)
{ // Generate all permutations of list[k:m].
int i;
if( k == m ) { // output a permutation
for(i = 0; i <= m; i++)
cout << list[ i ];
cout << endl;
}
else // list[k:m] has more than one permutation
// generate these recursively
for(i = k; i <= m; i++) {
Swap(list[ k ], list[ i ]);
Perm(list, k + 1, m );
Swap(list[ k ], list[ i ]);
}
}

template<class T>
inline void Swap(T& a, T& b)
{ // Swap a and b.
T temp = a;
a = b;
b = temp;
}
icank 2003-05-21
  • 打赏
  • 举报
回复
:(

这应该不是一个很难的问题吧
icank 2003-05-20
  • 打赏
  • 举报
回复
plainsong(伤心的风★短歌) :

呵呵,本人愚笨,还请您给出代码,谢谢!

zzpdhr():

如何用,能不能给个例子?谢谢!
zzpdhr 2003-05-20
  • 打赏
  • 举报
回复
算法非常多
不过可以直接用stl中的next_permutation
Jupin 2003-05-20
  • 打赏
  • 举报
回复
不好意思,只给出了全排列.
brokensword 2003-05-20
  • 打赏
  • 举报
回复
楼上的方法好像不对呀。
Jupin 2003-05-20
  • 打赏
  • 举报
回复
/* 试试我刚刚写完的这个程序 */
/* 全排列函数
* Date : May20, 2003
* Author: Awu
* Env : Dev C++ 4.9.8.0 + Win2000 Pro
*/
#include <stdio.h>
#include <stdlib.h>

/* 在此数组中存放要全排列的数据, 0是结束位 */
char g_acSet[] = {'1', '2', '3', 'a', 'b', 'c', 0};

char g_nSize = sizeof(g_acSet) / sizeof(*g_acSet) - 1;

long factorial(int size)
{
if (1 == size || !size)
return 1;
else
return size * factorial(size - 1);
}

main()
{
long count = 0 ;
int i; /* loop control */
long max;
if (1 == g_nSize)
{
printf("%s\n", g_acSet);
system("pause");
return;
}
max = factorial(g_nSize);
while (count < max)
{
for (i = 1; i < g_nSize; i++, count++)
{
printf("%s\n", g_acSet);
g_acSet[0] += g_acSet[i];
g_acSet[i] = g_acSet[0] - g_acSet[i];
g_acSet[0] -= g_acSet[i];
}
}
system("pause");
return;
}
/* 本算法空间复杂度O(n);
* 时间复杂度O(n!), 数据元素个数也为O(n!);
*/
wshcdr 2003-05-20
  • 打赏
  • 举报
回复
更好代码

期待ING
Jupin 2003-05-20
  • 打赏
  • 举报
回复
全排列程序我是写过的,不过现在一时想不起来,代码又不在,呵呵,帮不了你呀。
icank 2003-05-20
  • 打赏
  • 举报
回复
C++ 或者 C 的都可以。
加载更多回复(6)

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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