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

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

其实就是全排列问题,但是元素要从给出的数组里面取。
那位大虾可以给出源代码,谢谢!
...全文
379 26 打赏 收藏 转发到动态 举报
写回复
用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)

69,373

社区成员

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

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