请教一个关于n个数组的排列组合问题

jsidiot 2004-11-11 06:59:57
现有四个数组
分别如下:
A B C E
ddd hhhh sfsdf erefe
bbb kkkkk asdfs dfsadf
ccc xxxxxx sdfsd sdfsdf
ddd asdfas dffvd sdsdf
eee were vdddf sdsdfd

要求
每一个数组中取一条数据,求所有的集合,以ABCD顺序

ddd,hhhh......erefe
.
.
.
.
eee,were,vdddf,sdsdfd
中间的所有可能组合
另外还有重要的一点
就是数组数量不定,现在是四个,也许是n个,数组中的元素个数也不定
请教高手
...全文
277 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
jsidiot 2004-11-13
  • 打赏
  • 举报
回复
搞定
谢谢
jsidiot 2004-11-13
  • 打赏
  • 举报
回复
to: zzwu(未名)
我的n,m是不固定的,不过你的思路很好,对我是一个启发
jsidiot 2004-11-13
  • 打赏
  • 举报
回复
先测试一下,谢谢各位,因为我不会用c,所以里面可能有的语法还不是很懂
先琢磨一下方法把
rickone 2004-11-12
  • 打赏
  • 举报
回复
假设有n个数组每个数组都有m个元素:
如果n,m是固定的,很容易,两个循环就行了;
如果n,m是不固定的:
dfs(c)
如果c>n输出s[]中的一组组合
否则
for i=1 to m
{
s[c]=i
dfs(c+1)
}
}//dfs
s[]中是一些标记,输出时按对应的值输出:
如果s[]={1,1,1,1}
则为第一组解:ddd hhhh sfsdf erefe
如果s[]={4,4,4,4}
则为最后一组解:eee were vdddf sdsdfd

这类似于回溯,也类似于深搜对树的遍历。

更一般的情况,假如你的表是广义表,也就是说,有n个表,第i个表有m[i]个元素,也能用同样的方法做到:
dfs(c)
如果c>n输出s[]中的一组组合
否则
for i=1 to m[c]
{
s[c]=i
dfs(c+1)
}
}//dfs

我比较习惯用B写程序,所以只能写伪代码,希望能看得习惯。
zzwu 2004-11-12
  • 打赏
  • 举报
回复
而且进制是固定的5, 所以非常方便:

main()
{
char *A[5]={"a1ddd","a2bbb","a3ccc","a4ddd","a5eee"};
char *B[5]={"b1hhhh","b2kkk","b3xxx","b4ass","b5tht"};
char *C[5]={"c1ghfh","c2efer","c3ewe","c4ewe","c5dfd"};
char *D[5]={"d1fggf","d2fee","d3eeff","d4wewe","d5ff"};

int a,b,c,d,i;
for(i=0; i<5*5*5*5; i++)
{
d=i%5;
c=(i/5)%5;
b=(i/25)%5;
a=(i/125)%5;
printf("%s,%s,%s,%s\n",A[a],B[b],C[c],D[d]);
if (i%20==0) getch();
}
}
gxqcn 2004-11-11
  • 打赏
  • 举报
回复
说白了,这仅是一个类似(混合)进制遍历的排列问题。

请琢磨一下我们现有的日历系统,已知某天,它是如何确定出其(昨天和)明天的日历?
深入思考该问题将有助于该问题的解决。
如果还觉不够,请再加上时、分、秒、...
jsidiot 2004-11-11
  • 打赏
  • 举报
回复
关键是递归找不到关系
数组之间不存在关系,尽管可以再把这ABCDE定义到一个数组中,但是递归中无法调用
NowCan 2004-11-11
  • 打赏
  • 举报
回复
想了半天,感觉还是递归简单些,具体的还没想好。光定义这个数据结构就得想想。
A,B,C,D,,,这些里面的内容都是字符串,A,B,C,D,,,本身定义成指针数组,再用一个指针数组存放A,B,C,D,,,

33,010

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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