9名运动员参加比赛,需要分3组进行预赛。
有哪些分组的方案呢?
标记运动员为 A,B,C,... I
下面的程序列出了所有的分组方法:
ABC DEF GHI
ABC DEG FHI
ABC DEH FGI
ABC DEI FGH
..... (以下省略,总共560行)。
分析:代码填空题,改成编码题
先排三个,再排三个,最后排三个
(1)先分有A的一组: ABCABD ACD
ABE ACE ADE
ABF ACF ADF AEF
ABG ACG ADG AEG AFG
ABH ACH ADH AEH AFH AGH
ABI ACI ADI AEI AFI AGI AHI
第一位:全A
第二位:B―H,即第一位后――H
第三位:第二位后――I public class 分组比赛1 { public static void main(String[] args) { int LEN = 9; for (int _n2 = 1; _n2 < LEN; _n2++) { for (int _n3 = _n2 + 1; _n3 < LEN; _n3++) { String s = "A" + (char) (_n2 + 'A') + (char) (_n3 + 'A'); System.out.println(s); } } } }
(2)再分第二组
(3)最后剩下的三个为一组 定义数组_flag[9](已分组=1,未分组=0) A必排第一个,无条件_flag[0]=1 排第二个(n2):for(1 ~ length-1) n2已分组(_flag[n2] = 1) 排第三个(n3):for(n2+1 ~ length-1) n3已分组(_flag[n3] = 1) 前三个分组完成! String s1 = 拼出前三内容 call再分三个(s1,_flag数组) n3分组完成(_flag[n3] = 0) n2分组完成(_flag[n2] = 0) void 再分三个(s1,_flag数组){ 排第四个(i):for(1 ~ length-1) _flag[i]已经分组?continue:_flag=1; 排第五个(j):for(i+1 ~ length-1) _flag[j]已经分组?continue:_flag=1; 排第六个(k):for(j+1 ~ length-1) _flag[k]已经分组?continue:_flag=1; 中间三个分组完成! 分最后三个: for(1 ~ length-1){ _flag=0的全部是 } 本次分组完成! 拼出s2,s3 System.out.println(s1+s2+s3); k分组完成 (_flag = 0) j分组完成 (_flag = 0) i分组完成 (_flag = 0) } package bb; public class 分组比赛16JB3 { public static String m分最后三个(int[] a) { String s = ""; // 从0开始扫描(从1开始也行,反正A必是已被分组) // 没分组的全放进来 for (int i = 0; i < a.length; i++) { if (a[i] == 0) { s += (char) (i + 'A'); } } return s; } private static int num = 1; public static void m再分三个(String s, int[] a) { // 排4,5,6三人 // 第4人从0开始扫描(从1开始也行,反正A必是已被分组) for (int i = 1; i < a.length; i++) { if (a[i] == 1) {// 此人未分组则分之,分了组则跳过 continue; } else { a[i] = 1; } // 第5人从i+1开始扫描 for (int j = i + 1; j < a.length; j++) { if (a[j] == 1) { continue; } else { a[j] = 1; } // 第6人从j+1开始扫描 for (int k = j + 1; k < a.length; k++) { if (a[k] == 1) { continue; } else { a[k] = 1; } // 填空 System.out.print(num++); System.out.print(" "); // 天空位置在此: System.out.println(s + " " + (char) ('A' + i) + (char) ('A' + j) + (char) ('A' + k) + " " + m分最后三个(a)); // 填空位置 a[k] = 0;// 这是一一列举,这次输出了,不要占用,让出分组位置 } a[j] = 0; } a[i] = 0; } } public static void main(String[] args) { // 数组_flag,原题是数组a,表意性不强,用于标识每个运动员是否被分组 // 已分组=1 // 未分组=0 int[] _flag = new int[9]; _flag[0] = 1;// 分第一个运动员A(下标为0) for (int _n2 = 1; _n2 < _flag.length; _n2++) { _flag[_n2] = 1;// 分这个 for (int _n3 = _n2 + 1; _n3 < _flag.length; _n3++) { _flag[_n3] = 1;// 分这个 String s = "A" + (char) (_n2 + 'A') + (char) (_n3 + 'A'); m再分三个(s, _flag); _flag[_n3] = 0; } _flag[_n2] = 0; } } }