栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

m选n,并且对n全排列,不允许重复

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

m选n,并且对n全排列,不允许重复

package sftp;

import java.util.*;

public class Dfs {
    public static void main(String[] args) {
//        int[] count={1,2,3};
//        dfs(count,0,new int[3],0,3);

        Entity[] entities = new Entity[3];
        entities[0] = new Entity();
        entities[0].str = "A";
        entities[0].count = 1;

        entities[1] = new Entity();
        entities[1].str = "B";
        entities[1].count = 2;

        entities[2] = new Entity();
        entities[2].str = "C";
        entities[2].count = 3;

//        px2(entities);
        dfs(entities,0,new int[3],0,3);
//        pailie(entities,0,0,new String[6],new int[3][3]);

    }

    public static void dfs(Entity[] count, int n, int[] use, int sum, int max) {
        if (n >= count.length) {
            if (sum == max) {
//                for(int i=0; i res = new ArrayList<>();
                for (int i = 0; i < use.length; ++i) {
                    if (use[i] > 0) {
                        Entity entity = new Entity();
                        entity.count = use[i];
                        entity.str = count[i].str;
                        res.add(entity);
                    }
                }
                Entity[] newARR = new Entity[res.size()];
                res.toArray(newARR);
                pailie(newARR, 0, 0, new String[max], new int[100][100]);
                System.out.println();
                System.out.println();

            }
            return;
        }

        for (int i = 0; i <= count[n].count; ++i) {
            if (sum + i <= max) {
                use[n] = i;
                dfs(count, n + 1, use, sum + i, max);
            }
        }
    }

    public static void pailie(Entity[] entities, int m, int n, String[] showArr, int[][] state) {
        if (m == entities.length) {
            for (String s : showArr) {
                System.out.print(s);
            }
            System.out.println();

        }

        if (n == 0) {
            for (int i = 0; i < showArr.length; ++i) {
                if (showArr[i] == null) {
                    state[m][0] = i;
                    showArr[i] = entities[m].str;
                    if (n == entities[m].count - 1) {
                        pailie(entities, m + 1, 0, showArr, state);
                    } else {
                        pailie(entities, m, n + 1, showArr, state);
                    }
                    showArr[i] = null;
                }
            }
        } else {
            for (int i = state[m][n - 1] + 1; i < showArr.length; ++i) {
                if (showArr[i] == null) {
                    showArr[i] = entities[m].str;
                    state[m][n] = i;
                    if (n == entities[m].count - 1) {
                        pailie(entities, m + 1, 0, showArr, state);
                    } else {
                        pailie(entities, m, n + 1, showArr, state);
                    }
                    showArr[i] = null;

                }
            }
        }
    }


    public static void px2(Entity[] entities) {
        int arrLength = 0;
        Map map = new HashMap<>();
        for (int i = 0; i < entities.length; ++i) {
            arrLength += entities[i].count;
        }
        int[] arr = new int[arrLength];
        int index = 0;
        for (int i = 0; i < entities.length; ++i) {
            map.put(i, entities[i]);
            for (int j = 0; j < entities[i].count; ++j) {
                arr[index++] = i;
            }
        }
        print(arr, map);
        int currentIndex = arrLength - 2;
        while (currentIndex >= 0) {
            Integer nextIndex = getNextIndex(arr, currentIndex + 1, arrLength - 1, arr[currentIndex]);
            if (nextIndex == null) {
                currentIndex--;
            } else {
                int temp = arr[currentIndex];
                arr[currentIndex] = arr[nextIndex];
                arr[nextIndex] = temp;
                Arrays.sort(arr, currentIndex + 1, arr.length);
                print(arr, map);
                currentIndex = arrLength - 2;
            }
        }
    }

    public static void print(int[] arr, Map map) {
        for (int i = 0; i < arr.length; ++i) {
            System.out.print(map.get(arr[i]).str);
        }
        System.out.println();
    }

    private static Integer getNextIndex(int[] arr, int i, int j, int curr) {
        int min = Integer.MAX_VALUE;
        Integer minIndex = null;
        for (int k = i; k <= j; ++k) {
            if (arr[k] > curr && arr[k] < min) {
                min = arr[k];
                minIndex = k;
            }
        }
        return minIndex;
    }

    public static class Entity {
        int count;
        String str;
    }

}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/736454.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号