有一个二维的数据,例如下:
List<List<string>> aaa = new List<List<string>>();
aaa.Add(new List<string>(){"1","2","3"});
aaa.Add(new List<string>(){"4","5","6"});
aaa.Add(new List<string>(){"7","8","9"});
数据的行数不固定,每行的列数都不一定相同
现在要从这个数据中,任选N行,每行任取一个数,做一个全排,中间;隔开
假设数据是这样的,N=2
结果是:
1;4 1;5 1;6 1;7 1;8 1;9 2;4 2;5 2;6 2;7 2;8 2;9 3;4 3;5 3;6 3;7 3;8 3;9 4;7 4;8 4;9 5;7 5;8 5;9 6;7 6;8 6;9 的一个集合
如果N=3,就是 1;4;7 1;4;8 1;4;8 1;5;7 1;5;8 1;5;9 1;6;7 1;6;8 1;6;9 ……等等 一个集合,这个算法 用深搜 要怎么写呢,C#语言
这是ACM吧,自己写写,有益于身心健康。
package cnblogs; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Test02 { public static void doPrint(List<List<String>> list, int[] marks){ int tmp, j = 0, len = marks.length; List<String> t = null; for(int i = 0; i < len; i++){ j = 0; tmp = marks[i]; t = list.get(j); while(tmp >= t.size()){ j++; tmp -= t.size(); t = list.get(j); } if(i > 0) System.out.print(','); System.out.print(t.get(tmp)); } System.out.print(' '); } public static void doSelect(int groupSize, List<List<String>> list){ int count = 0; for(List<String> strList : list){ count += strList.size(); } int[] marks = new int[groupSize]; for(int i = 0; i < groupSize; i++) marks[i] = i; int offset = count - groupSize; while(true){ doPrint(list, marks); if(marks[0] == offset) return; for(int i = groupSize - 1; i >= 0; i--){ if(marks[i] < (offset + i)){ marks[i]++; for(int j = i + 1; j < groupSize; j++){ marks[j] = marks[j - 1] + 1; } break; } } } } public static void main(String[] args) { List<List<String>> list = new ArrayList<List<String>>(); list.add(Arrays.asList("1", "2", "3")); list.add(Arrays.asList("4", "5", "6")); list.add(Arrays.asList("7", "8", "9")); doSelect(2, list); } } //1,2 1,3 1,4 1,5 1,6 1,7 1,8 1,9 2,3 2,4 2,5 2,6 2,7 2,8 2,9 3,4 3,5 3,6 3,7 3,8 3,9 4,5 4,6 4,7 4,8 4,9 5,6 5,7 5,8 5,9 6,7 6,8 6,9 7,8 7,9 8,9
加班ing,回家才有VS,不知道写得对不对,题主测试测试吧
公司只有JAVA,抱歉,不过应该差不多
矩阵