【Java/算法/排列】ABCDE五人排一排,如果AB必相邻且B在A的右边,那么不同的排法有几种?

【数学解法】

AB捆绑,内部不再排序,与CDE全排,得A44=24种排法。

【代码解法】

Fiveman类:

复制代码
package test230425;

import java.util.List;

import arrange.Arranger;

/**
 * ABCDE五人排一排,如果AB必相邻且B在A的右边,那么不同的排法有几种?列举出这些排法。
 */
public class Fiveman {
    public static void main(String[] args) {
        final String[] names = { "AB", "C", "D", "E" };
        final int[] arr = { 0, 1, 2, 3 };

        Arranger arranger = new Arranger(arr);
        int idx = 0;
        for (List<Integer> res : arranger.getResults()) {
            String name = "";
            for (int i = 0; i < names.length; i++) {
                name += names[res.get(i)];
            }

            System.out.println(String.format("%02d", ++idx) + "." + name);
        }
    }
}
复制代码

Arranger类:

复制代码
package arrange;

import java.util.ArrayList;
import java.util.List;

/**
 * 用于产生数组全排列结果的工具类
 * @since 2023/4/21
 */
public class Arranger {
    // 保存在内部的原始元素数组的引用
    private int[] rawArr;

    // 返回结果
    private List<List<Integer>> results;

    /**
     * 构造函数
     * 
     * @param raws 原始元素数组
     */
    public Arranger(int[] raws) {
        rawArr = raws;
        results = new ArrayList<>();

        doArrange(new ArrayList<>());
    }

    /**
     * 使用递归进行全排列,结果放在results中
     * 
     * @param initialList 初始链表
     */
    private void doArrange(List<Integer> initialList) {
        List<Integer> innerList = new ArrayList<>(initialList);

        if (rawArr.length == initialList.size()) {
            results.add(innerList);
        }

        for (int i = 0; i < rawArr.length; i++) {
            if (innerList.contains(rawArr[i])) {
                continue;
            }

            innerList.add(rawArr[i]);
            doArrange(innerList);
            innerList.remove(innerList.size() - 1);
        }
    }

    /**
     * 获得结果链表的引用
     * 
     * @return
     */
    public List<List<Integer>> getResults() {
        return results;
    }

    // 测试
    public static void main(String[] args) {
        int[] numbers = { 1, 2, 3,4,5};
        Arranger arranger = new Arranger(numbers);

        int idx = 0;
        for (List<Integer> re : arranger.getResults()) {
            System.out.println(String.format("%02d", ++idx) + "." + re);
        }
    }
}
复制代码

【排序结果】

复制代码
01.ABCDE
02.ABCED
03.ABDCE
04.ABDEC
05.ABECD
06.ABEDC
07.CABDE
08.CABED
09.CDABE
10.CDEAB
11.CEABD
12.CEDAB
13.DABCE
14.DABEC
15.DCABE
16.DCEAB
17.DEABC
18.DECAB
19.EABCD
20.EABDC
21.ECABD
22.ECDAB
23.EDABC
24.EDCAB
复制代码

END

 

posted @   逆火狂飙  阅读(46)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
历史上的今天:
2022-04-25 SpringBoot中控制器如何接纳前台传来的含列表数据
2020-04-25 ElasticsSearch初装 环境Win10
2019-04-25 【高中数学/基本不等式】已知:x>0,y>-1,且x+y=1 求:(x^2+3)/x+y^2/(y+1)的最小值为?
2018-04-25 【高中数学/极值/基本不等式】已知正数a,b满足a+4b+2ab=6,则a+4b的最小值为?
2018-04-25 【Nodejs】cheerio简单示例
2018-04-25 【Nodejs】nimble或async并不能保证程序串行执行,回调是回避不了的坑
2015-04-25 安全驾驶技巧
生当作人杰 死亦为鬼雄 至今思项羽 不肯过江东
点击右上角即可分享
微信分享提示