题目:
有一个二维Vector,每个元都是字符串(或者其他对象),如下面这个三行,每行元素不固定的二维Vector V。
A、B、C、D
H、I、J、K、M
X、Y、Z
求出满足以下条件的所有Vector D(一定是所有可能的情况):
1.此Vector D的元素包含V的所有元素,且每个元素仅出现一次
2. 此Vector D中包含在V[1]中的元素之间的顺序不能发生改变,即A、B、C、D之间的顺序不发生改变,同理,V[2]、V[3]。都不发生改变。对于本例,也就是 说,在结果D中,A、B、C、D的先后顺序不变,H、I、J、K、M的先后顺序不变,X、Y、Z的先后顺序不变。结果D的几种可能的情况是:
1:A、B、C、D、H、I、J、K、M、X、Y、Z
2:H、I、A、B、C、X、D、J、K、Y、Z、M
3:A、H、I、X、Y、Z、B、C、J、K、M、D等等
package com.sw.suanfa.first.ten; import java.util.Vector; /** * 有一个二维Vector,每个元都是字符串(或者其他对象),如下面这个三行,每行元素不固定的二维Vector V。 A、B、C、D H、I、J、K、M X、Y、Z 求出满足以下条件的所有Vector D(一定是所有可能的情况): 1.此Vector D的元素包含V的所有元素,且每个元素仅出现一次 2. 此Vector D中包含在V[1]中的元素之间的顺序不能发生改变,即A、B、C、D之间的顺序不发生改变,同理,V[2]、V[3]。都不发生改变。对于本例,也就是说,在结果D中,A、B、C、D的先后顺序不变,H、I、J、K、M的先后顺序不变,X、Y、Z的先后顺序不变。结果D的几种可能的情况是: 1:A、B、C、D、H、I、J、K、M、X、Y、Z 2:H、I、A、B、C、X、D、J、K、Y、Z、M 3:A、H、I、X、Y、Z、B、C、J、K、M、D等等 * @author songwei *解决方案:递归中方法:首先找出下一个位置能出现的字符。 *比如第一次为A,H,X可以出现在第一个位置。 *则对其进行循环。 *当取第一个为A的时候,游标数组表示为[1,0,0]。意思为,第一个childV下次取值位置为第二个位置。然后进入下一个取值, * 下一次取值为范围根据游标可得为B,H,X。循环,当取B时,游标数组表示为[2,0,0]。可以保证一个childV中的数值顺序不会乱掉。 *........依此进行循环递归即可。 *我这里没有考虑childV中自身有重复,比如A、B、C、D、B、C、D *以及两个childV中存在重复[A、B、C、D] [H、I、A、B、C、D、J、K、M] *感觉有点复杂了!谁能更好的处理,请给我个代码哈。
*/
public class ComposeVector {
private static Vector<Vector<String>> parentV = new Vector<Vector<String>>();
public static void main(String[] args) {
Vector<String> childV1 = new Vector<String>();
childV1.add("A");
childV1.add("B");
// childV1.add("C");
// childV1.add("D");
Vector<String> childV2 = new Vector<String>();
childV2.add("H");
// childV2.add("B");
childV2.add("I");
// childV2.add("J");
// childV2.add("K");
Vector<String> childV3 = new Vector<String>();
childV3.add("X");
childV3.add("Y");
// childV3.add("Z");
parentV.add(childV1);
parentV.add(childV2);
parentV.add(childV3);
int[] cursor = new int[parentV.size()];
getNextString(cursor,new Vector<String>());
}
/**
*
* @param cursor 游标序列。其中数组下标表示parentV中的各个childV的序号,数组值对应该childV中被取值的位置。
* @param currentVector 当前序列
*
*/
public static void getNextString(int[] cursor,Vector<String> vector){
Vector<String> next = new Vector<String>();
int nullNum = 0;
for(int i=0;i<parentV.size();i++){
Vector<String> tmp = parentV.get(i);
int cursorTmp = cursor[i] ;
if(tmp.size()<=cursorTmp){
next.add(null);//用null来区分。
nullNum ++ ;
}else{
next.add(tmp.get(cursorTmp));
}
}
if(next.size() == nullNum){
outVector(vector);
return ;
}
for(int j=0;j<next.size();j++){
String nextVectorStr = next.get(j);
if(nextVectorStr == null) continue ;
//对currentVector和游标数组进行clone后,再进行操作,以免影响下次循环的传值。
Vector<String> currentVector = (Vector<String>)vector.clone();
int[] currentCursor = cursor.clone();
currentVector.add(nextVectorStr);
int cu = currentCursor[j];
currentCursor[j] = cu+1 ;//将该字符所在的Vector的游标+1
getNextString(currentCursor, currentVector);
}
}
/**
* 打印Vector
* @param v 需打印的Vector
*/
public static void outVector(Vector<String> v){
for(String t:v){
System.out.print(t);
System.out.print(" ");
}
System.out.println("");
}
}
写的不是很好。写着写着脑子就有点乱了。算了,就先这样吧。