(本文年代久远,请谨慎阅读)要求是这样的:
有N个数组,每个数组元素不定,从每个数组都中取出一个,组成长度为N的序列,求穷尽序列的所有情况。
很明显这区别于给定几个元素并把这些元素全排列的问题,全排列要交换位置,此处则不同,暂称“伪全排列”。
网上资料很多,不过多用指针或者指针数组,这对于JAVA来说没一点用。
在此,我把JAVA中的实现来个详细说明。
首先,思路为递归,将其写为成员函数,方便调用。
public class ABC{
private static int[][]str;
public ABC() {
... ...
//str[][]的赋值语句,得到存储完成的二维数组,见‘创建动态二维数组的技巧’
... ...
int result[]=new int[ N ]; //此处即符合要求的,有N个数组
show(result,0); //进入递归函数,进行测试
}
public static void show(int[] result1, int curr){ //curr即代表当前取元素的数组
if (curr == N) { //curr==N即完成一个序列,输出一次结果集
for(int k=0;k<result1.length;k++) System.out.print(result1[k]);
System.out.println(); //输出格式控制
}else {
for (int i = 0; i <str[curr].length; ++i) { //每次循环此次取元素的数组的长度
result1[curr] = str[curr][i]; //关键赋值处,给到结果集
show(result1, curr+1); //一次递归完成,即从下一个数组中去取元素,curr+1.
}
}
}
以上可完成所有情况的输出,输入集是个二维数组,可方便由多种数据类型转化得到。输出是一维数组,也可方便进行再处理,故代码易改造,简洁明了。以上即是实现的所有代码(测试+方法)。
测试如下,从七个数组中取:
[01234],[012],[012345],[0123456],[0123456],[012],[01234]
情况序列计数为66150个,结果集输出正确,此处省略。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有