第七届蓝桥杯JAVA语言B组_分小组

来源:互联网 发布:linux stage2存放在哪 编辑:程序博客网 时间:2024/04/30 00:36
题目:分小组


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
ABC EFH DGI
ABC EFI DGH
ABC EGH DFI
ABC EGI DFH
ABC EHI DFG
ABC FGH DEI
ABC FGI DEH
ABC FHI DEG
ABC GHI DEF
ABD CEF GHI
ABD CEG FHI
ABD CEH FGI
ABD CEI FGH
ABD CFG EHI
ABD CFH EGI
ABD CFI EGH
ABD CGH EFI
ABD CGI EFH
ABD CHI EFG
ABD EFG CHI
..... (以下省略,总共560行)。


public class A
{
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');
f(s,a);
a[c] = 0;
}
a[b] = 0;
}
}
}

//答案为:s+" "+ (char)(i+'A') + (char)(j+'A') + (char)(k+'A')  + " "+remain(a)

        先说一下自己做这道题的思路,自己先推出了s和remain(a),忽略了char(i+'A')...的部分,但当自己看到答案的一瞬间理解了最后结果的由来。

首先附上自己的思考方式:

        先看方法有三个:主函数,f(),remain()函数,这个有三个函数,然后发现remain()函数没有用到,故答案中一定有remain()。

然后输入remain()来看一下答案,发现remain()的值都为GHI FHI DGI....是最后列的数值

然后寻找其他字符串,发现s,输出s得到了ABC ABC ABC ...感觉和第一列相同然后就只差中间那一列的内容了。

然后分析一下主函数和f函数,发现主函数两个for嵌套,首次结果为ABC即s=ABC随后s=ABD ABE....

确定了s的输出为第一列,分析到这里发现在main中s的输出 "A" + (char)(b+'A') + (char)(c+'A');

然后在f()方法中发现了i,j,k然后考虑上述用法得出结论。(char)(i+'A') + (char)(j+'A') + (char)(k+'A')  得出结论

这个方法偏向于凑结果,没有任何理论依据,因为题目中不会给出没用的函数,不会给出没用的数据,所以可以试一下。


然后说一下个人认为比较适合萌新考试的做法

先进行一个简单的猜想,大概方法类似于上边所说。先大体浏览完题之后,可以考虑到,定义a[i]的作用是判断此数是否被用,用了则不输出。

浏览题目发现有三个函数,最后要输出ABC DEF GHI然后所有一定是3个一组,每组之间用" "隔开。

在main函数的循环数组a长度为9,在循环中,先定义某些为1表示已经占用,然后看main函数
第一次中a[1]a[2]a[3]都变为了1,然后f(ABC,a)
随后的循环是a[1]a[2]a[4]变为1,然后f(ABD,a)
随后的循环a[1][2][5]变为1,然后是f(ABE,a)

在以f(ABC,a)为例,考虑f()方法

在f中是三个for循环,其中都对a[i]=1的情况进行的排除,当为1则进行下一次的循环即在第一个for i=0,1,2的时候a[i]=1只能进行continue,而到3才能向下走即i=3 a[3]=1;随后a[j]同理得j=4 a[4]=1;随后k=5 a[5]=1;
然后就过渡到了System,因为填空先不考虑。这个后面是把赋值回复。恢复成只有0 1 2 3 4 为1的状态
随后进行k=5 k=6 k=7 k=8 k=9的运算,前面已经说了a.length==9.
然后是j=5 k=6 k=7 k=8的运算。(其for循环的j=i+1 k=i+1的初始条件保证了i<k<j的条件。)

好,这个时候发现两个函数都看完了,但还没有用到remain啊,先看一下remain是什么东西remain的作用remain是把没有标记为1的部分从小到大输出则为剩余的字符,此时也有i+A,已经看见两次,所有的s的赋值都为这个,需要注意下。

总和分析在f(ABC,a)中在System前s=ABC,a的0->5共6位变成了1,i j k分别为3 4 5,remain()方法则表示输出剩余的,若此时调用则输出6 7 8项

综上可得三个字符串 为s  ijk remain() 但ijk为数字怎么办,数字转化成字符即(char)(i+"A")...就可以了


当然如果可以直接看懂程序就不需要带入一个数,去走一遍流程了。

0 0
原创粉丝点击