蓝桥杯——分组比赛(2017JavaB组第3题)

分组比赛(17JavaB3)

9名运动员参加比赛,需要分3组进行预赛。

有哪些分组的方案呢?

标记运动员为 A,B,C,... I

下面的程序列出了所有的分组方法:

ABC DEF GHI

ABC DEG FHI

ABC DEH FGI

ABC DEI FGH

..... (以下省略,总共560行)。

分析:代码填空题,改成编码题

先排三个,再排三个,最后排三个

(1)先分有A的一组:

ABC
ABD 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;
		}
	}
}
posted @ 2019-07-14 01:12  虎老狮  阅读(496)  评论(0编辑  收藏  举报