分小组
9名运动员参加比赛,需要分3组进行预赛。
有哪些分组的方案呢?
我们标记运动员为 A,B,C,… I
下面的程序列出了所有的分组方法。
该程序的正常输出为:
ABC DEF GHI
ABC DEG FHI
ABC DEH FGI
ABC DEI FGH
ABC DFG EHI
ABC DFH EGI
…… …… ……
解题思路:这是一道代码填空题,可能读不懂代码,但是也能做出来,首先填空的是输出,输出的肯定是案例中的输出,调用f()方法前,可以先输出s,发现s占三个字符,说明需要填的空中也有s,并且只占3个字符,继续观察,remain()方法还是没有使用,再次试着输出它,发现还占三个字符,输出中肯定有对这个方法的调用(不然白写了),最难的是剩下三个字符在哪呢?在输出的这个方法中找,发现有三个参数,i,j,k刚好三个字符,并且一定是紧连着的,然后调三个参数的位置,和第一条输出对比,不难找出正确答案。
public class Demo_7_04
{
public static String remain(int[] a)
{
String s = "";
for(int i=0; i<a.length; i++){
if(a[i] == 0) s += (char)(i+'A');
}
return s;
}
public static void f(String s, int[] a)
{
for(int i=0; i<a.length; i++){
if(a[i]==1) continue;
a[i] = 1;
for(int j=i+1; j<a.length; j++){
if(a[j]==1) continue;
a[j]=1;
for(int k=j+1; k<a.length; k++){
if(a[k]==1) continue;
a[k]=1;
System.out.println(s+(char)(i+'A')+(char)(j+'A')+(char)(k+'A')+remain(a)); //填空位置
a[k]=0;
}
a[j]=0;
}
a[i] = 0;
}
}
public static void main(String[] args)
{
int[] a = new int[9];
a[0] = 1;
for(int b=1; b<a.length; b++){
a[b] = 1;
for(int c=b+1; c<a.length; c++){
a[c] = 1;
String s = "A" + (char)(b+'A') + (char)(c+'A'); //字符串s只有三位
f(s,a);
//回溯
a[c] = 0;
}
a[b] = 0;
}
}
}