zoukankan      html  css  js  c++  java
  • 蓝桥杯——分组比赛(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;
    		}
    	}
    }
    
  • 相关阅读:
    c# 运算符 ? ??
    c# linq <未完>
    javasript this
    python3 闭包(一)
    dom 中的换行符
    (转)关于 awk 的 pattern(模式)
    linux note(1)
    python sqlite3
    python 特殊方法
    Go Example--锁
  • 原文地址:https://www.cnblogs.com/tigerlion/p/11182881.html
Copyright © 2011-2022 走看看