• 郊游


    /*
     * 幼儿园小朋友下周要郊游。带队老师想在郊游时让两名学生组成一个小队进行活动。不过让两名不是朋友
     * 的学生组成一队会发生争执或者不理睬。因此,必须由两名朋友关系的学生组队。
     * 给定各学生的朋友关系详情,编写程序计算出所有可配对的不同方法。任何一个不相同的配对都将视为一种不同的
     * 配对方法。例如以下两种配对方法就属于不同的配对方法。
     * (泰妍,杰西卡)(珊妮,蒂芬妮)(孝渊,余利)
     * (泰妍,杰西卡)(珊妮,余利)(孝渊,蒂芬妮)
     * 
     * 限定时间及内存使用
     *    执行程序的限定时间为1s,内存使用限制为64MB
     * 输入:
     *    输入方式为,第一行输入测试用例个数C(C≤50),各测试用例的第一行输入学生数量n(2≤n≤10)和
     *    朋友关系数m(0≤m≤n(n-1)/2)。下一行输入m个整数对,表示具有朋友关系的学生序号。
     *    序号是0到n-1的整数,相同配对只输入一次。学生数量是双数。	
     * 输出:
     *    每个测试用例用1行输出朋友关系的学生可配成对的总数。
     * 示例输入值:
     * 3
     * 2 1
     * 0 1
     * 4 6
     * 0 1 1 2 2 3 3 0 0 2 1 3
     * 6 10
     * 0 1 0 2 1 2 1 3 1 4 2 3 2 4 3 4 3 5 4 5
     * 示例输出值:
     * 1
     * 3
     * 4
     * 第一个输入(2 1)中,只有两名学生,而且是朋友关系。故只有一种可能,即学生0和学生1。
     * 第二个输入(4 6)中,有4名学生,而且彼此都是朋友。假设各自为丁丁、迪西、娜娜、小波,那么有一下3种组合
     * (丁丁,迪西)(娜娜,小波)
     * (迪西,小波)(娜娜,丁丁)
     * (娜娜,迪西)(小波,丁丁)
     * 
     */
    import java.util.Scanner;
    
    public class test1 {
    	static int n, m;
    	static boolean[][] arefriends = new boolean[10][10];
    	static boolean[] books = new boolean[10];
    
    	public static void main(String[] args) {
    		Scanner cin = new Scanner(System.in);
    		int c = cin.nextInt();
    		for (int i = 0; i < c; ++i) {
    			n = cin.nextInt();
    			m = cin.nextInt();
    			if (Check()) {
    				if (n == 2 && m == 1) {
    					System.out.println(1);
    					continue;
    				}
    				// 避免上一次影响,每次用之前清空数组
    				clearAreFriends();// Arrays.fill只能赋值一维数组
    				for (int j = 0; j < m; ++j) {
    					int x = cin.nextInt();
    					int y = cin.nextInt();
    					arefriends[x][y] = arefriends[y][x] = true;
    				}
    				System.out.println(partings());
    			} else {
    				--i;
    			}
    		}
    		cin.close();
    	}
    
    	public static void clearAreFriends() {
    		for (int i = 0; i < arefriends.length; ++i) {
    			for (int j = 0; j < arefriends[0].length; ++j) {
    				arefriends[i][j] = false;
    			}
    		}
    	}
    
    	public static boolean Check() {
    		if (n > 0 && n != 1) {// 题目限定了2≤n≤10,虽说多余,但测试用例有n为0的情况
    			return true;
    		}
    		return false;
    	}
    
    	// 若第books[i]=i个学生找到了伙伴,则返回true
    	public static int partings() {
    		// 在剩余学生中查找序号最靠前的学生
    		int flag = -1;
    		for (int i = 0; i < n; ++i) {
    			if (!books[i]) {
    				flag = i;
    				break;
    			}
    		}
    		// 初始部分:所有学生都找到了伙伴,那么已找出1种组合方式,故终止
    		if (flag == -1)
    			return 1;
    		int res = 0;
    		// 选择与此学生组队的伙伴
    		for (int end = flag + 1; end < n; ++end) {
    			if (!books[end] && arefriends[flag][end]) {
    				books[flag] = books[end] = true;
    				res += partings();
    				books[flag] = books[end] = false;
    			}
    		}
    		return res;
    	}
    }
    ========================================Talk is cheap, show me the code=======================================
    CSDN博客地址:https://blog.csdn.net/qq_34115899
  • 相关阅读:
    HDU
    C# Stopwatch
    RMQ(Range Minimum Query)问题(转)
    HDU
    POJ
    HDU
    POJ
    POJ
    docker安装testlink
    廖雪峰Java2面向对象编程-3继承和多态-2多态
  • 原文地址:https://www.cnblogs.com/lcy0515/p/9179838.html
Copyright © 2020-2023  润新知