联赛赛程的排列

时间:2015-12-28 23:14:02

标签: java algorithm permutation

创建联盟调度软件,并有一个数学问题,我需要一点帮助包裹我的脑袋。

假设您有4个团队(为简单起见),并检查1,2,3,4的每个可能的排列。这个排列只被称为第一周,它给你24种可能的排列。

<1,2> 1,2,3,4是一个排列,并说第1周1X4是一个游戏2X3是一个游戏。 第二周的游戏组合是通过循环赛设定的,所以下一个是4,1,2,3; 4X3 1X2是游戏。

我的问题是,如果第二周的游戏组合不起作用(因为约束),而是3,4,1,2的订单可以通过执行周上的排列来检查1?即第1周为1,2,3,4周2为3,4,1,2

或者我是否需要置换第1周然后置换第2周等等以实际获得所有可能的时间表。我的直觉告诉我,我确实需要每周进行一次置换,以便真正得到每个可能的时间表排列。

编辑: 我询问是否有四周我的排列计算器是24 * 24 * 24 * 24而不仅仅是24。

2 个答案:

答案 0 :(得分:1)

就我而言,这个解决方案可能会对你有所帮助 首先,您从用户那里获取一周的输入。之后,您计算一周的排列 最后,乘以周的力量。

public class Schedule {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        System.out.println("Enter week");
        int x = scan.nextInt();
        int y = (int) Math.pow(permutation(x), x);
        System.out.println(y);
    }

    public static int permutation(int week) {
        int y;
        if (week == 1) {
            return 1;
        } else {
            y = week * permutation(week - 1);
        }
        return y;
    }
}

答案 1 :(得分:1)

要直接回答您的问题,只检查第1周的所有排列并不一定会导致检查所有可能的排列。用一些简单的样本进行测试,你会很快看到它

我认为你需要一个标准的Backtracking算法。这些是针对具有约束的这些类型的问题而设计的。

一般形式就像

function permutation
    if all current matches satisfy constraints
        if any weeks remaining to be allocated
            for each possible match for next week
                call permutation with that match added
        else
            accept this solution

假设有足够的约束条件,很少有排列是合法的。但是,如果许多排列是合法的,那么接受解决方案的过程将需要考虑如何处理它们。