zoukankan      html  css  js  c++  java
  • 郊游

    /*
     * 幼儿园小朋友下周要郊游。带队老师想在郊游时让两名学生组成一个小队进行活动。不过让两名不是朋友
     * 的学生组成一队会发生争执或者不理睬。因此,必须由两名朋友关系的学生组队。
     * 给定各学生的朋友关系详情,编写程序计算出所有可配对的不同方法。任何一个不相同的配对都将视为一种不同的
     * 配对方法。例如以下两种配对方法就属于不同的配对方法。
     * (泰妍,杰西卡)(珊妮,蒂芬妮)(孝渊,余利)
     * (泰妍,杰西卡)(珊妮,余利)(孝渊,蒂芬妮)
     * 
     * 限定时间及内存使用
     *    执行程序的限定时间为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
  • 相关阅读:
    克如斯卡尔 P1546
    真正的spfa
    第四课 最小生成树 要点
    关于vscode中nullptr未定义
    cmake学习笔记
    python学习笔记
    (BFS 图的遍历) 2906. kotori和迷宫
    (图论基础题) leetcode 997. Find the Town Judge
    (BFS DFS 并查集) leetcode 547. Friend Circles
    (BFS DFS 图的遍历) leetcode 841. Keys and Rooms
  • 原文地址:https://www.cnblogs.com/lcy0515/p/9179838.html
Copyright © 2011-2022 走看看