题目:
9名运动员参加比赛,需要分3组进行预赛。
有哪些分组的方案呢?
我们标记运动员为 A,B,C,... I
下面的程序列出了所有的分组方法。
该程序的正常输出为:
ABC DEF GHI
ABC DEG FHI
ABC DEH FGI
ABC DEI FGH
ABC DFG EHI
ABC DFH EGI
ABC DFI EGH
ABC DGH EFI
ABC DGI EFH
ABC DHI EFG
ABC EFG DHI
..... (以下省略,总共560行)。
分析:
这道题分三个组,第一个组我们让他在主函数里遍历所有可能,第二组我们建一个新的自定义函数,里面弄三个嵌套循环,求三个
步骤:
package 历届刷题前7214;
public class 分小组 {
public static void main(String[] args) {
int[] a = new int[9];//数组用来储存9个字母
a[0] = 1;//我们让第一项始终为1
for (int i = 1; i < a.length; i++) {//第二个位置
a[i] = 1;//每到达下一项就让这一项等于1
for (int j = i + 1; j < a.length; j++) {//第三个位置
a[j] = 1;//每到达下一项就让这一项等于1
String s = "A" + (char) (i + 'A') + (char) (j + 'A');//第一组所有的可能
f(s, a);
a[j] = 0;//退出来的时候归0
}
a[i] = 0;//退出来的时候归0
}
}
private static void f(String s, int[] a) {
for (int i = 0; i < a.length; i++) {//第四个位置
if (a[i] == 1) {//如果等于1的话那就继续循环直到不是1为止
continue;
}
a[i] = 1;//不是1现在赋1
for (int j = i + 1; j < a.length; j++) {//第五个位置
if (a[j] == 1) {
continue;
}
a[j] = 1;
for (int j2 = j + 1; j2 < a.length; j2++) {//第六个位置
if (a[j2] == 1) {
continue;
}
a[j2] = 1;
//主函数里的s代表前三个,f函数里i,j,j2代表中间三个,然后用remain求出所有等于0的,就是剩余的
System.out.println(s + " " + (char) ('A' + i) + "" + (char) ('A' + j) + "" + (char) ('A' + j2) + " "
+ remain(a));
a[j2] = 0;
}
a[j] = 0;
}
a[i] = 0;
}
}
public static String remain(int[] a) {
String s = "";
for (int i = 0; i < a.length; i++) {
if (a[i] == 0)//如果说等于0那就没出现过,直接赋值给s
s += (char) (i + 'A');
}
return s;
}
}