1. 程式人生 > >第七屆藍橋杯 省賽 JavaB組 分小組

第七屆藍橋杯 省賽 JavaB組 分小組

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行)。

package com.test.zx;

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)
	{
		//從剩下的6個字母中選取三個
		for(int i=0; i<a.length; i++){//第4個字母
			if(a[i]==1) continue;
			a[i] = 1;
			for(int j=i+1; j<a.length; j++){//第5個字母
				if(a[j]==1) continue;
				a[j]=1;
				for(int k=j+1; k<a.length; k++){//第6個字母
					if(a[k]==1) continue;
					a[k]=1;
					System.out.println(__________________________________);  //填空位置
					a[k]=0;
				}
				a[j]=0;
			}
			a[i] = 0;
		}
	}
	
	public static void main(String[] args)
	{
		//設定一個9個字母的整形陣列,用來標記哪個字母已經被使用
		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');//選出帶有A的第一個小組,儲存在字串s中 
				f(s,a);//從剩下的6個人中抽取3個人
				a[c] = 0;//清除標記
			}
			a[b] = 0;//清除標記
		}
	}
}


填空答案:

s + " "+ (char)(i+'A') + (char)(j+'A') + (char)(k+'A') + " " + remain(a)

題目理解:

首先:本道題給出的程式碼並不符合題意。題目要求的是9個人分成三組,是沒順序的,即ABC 和ACB用該視為一種情況。答案應該是280種,而非560種。

題目中反覆出現+‘A’,從此入手理解程式碼。題目的思路是先找出由A組成的一個小組,再從剩下的6箇中隨機選三個成為第二個小組,剩下的三個即為第三小組。

本題是全排列遞迴方法的應用。