zoukankan      html  css  js  c++  java
  • 排列组合问题以及其应用

    排列组合问题在实际生活当中有很多的应用,比如八皇后问题中要求出符合要求的皇后布局,首先要有能力进行可能布局的枚举,而枚举的过程就是一个全排列的过程,而排列组合问题的代码递归式是很容易迷惑人的,我参考了很多的实现,觉得下面的实现比较好,当然我自己重写并测试了。主要是实现了全排列,排列,以及组合的递归实现,有些迷惑性。不过看了一下还有非递归实现的版本,下次再补充上吧。

    //to permutate the data in an array
    //author:sdy
    //creation-time:2014/2/24-17:18
    
    public class permutation{
        
        private int permutationNum;
    
        public permutation(){
            this.permutationNum=0;
        }
    
        public void permutateAll(int[] data){
            this.permutationNum=0;
            this.permutateCoreAll(data,0);
        }
    
        private void permutateCoreAll(int[] data,int index){
            if(data==null||data.length==0){
                return;
            }
            if(index==data.length){
                this.permutationNum=this.permutationNum+1;
                System.out.println(this.permutationNum+":"+this.printArray(data));
            }
            else{
                for(int i=index;i<data.length;i++){
                    int temp;
                    temp=data[index];
                    data[index]=data[i];
                    data[i]=temp;
    
                    this.permutateCoreAll(data,index+1);
    
                    temp=data[index];
                    data[index]=data[i];
                    data[i]=temp;
                }
            }
        }
    
        public void permutate(int[] data,int k){
            this.permutateCore(data,0,k);
        }
        private void permutateCore(int[] data,int index,int k){
    
            if(index==k){
                System.out.println(this.printArray(data,k));
                return;
            }
            for(int i=index;i<data.length;i++){
                int temp;
                temp=data[index];
                data[index]=data[i];
                data[i]=temp;
    
                this.permutateCore(data,index+1,k);
    
                temp=data[index];
                data[index]=data[i];
                data[i]=temp;
    
            }
    
    
        }
    
        private String printArray(int[] data,int length){
            String str="[";
            for(int i=0;i<length;i++){
                str+=data[i]+" ";
            }
            return str+"]";
        }
    
        private String printArray(int[] data){
            String str="[";
            for(int i=0;i<data.length;i++){
                str=str+data[i];
                if(i!=data.length-1){
                    str+=",";
                }
            }
            str=str+"]";
            return str;
        }
    
        public void combine(int[] data,int k){
            int[] subData=new int[k];
            this.combineCore(data,data.length,k,subData);
        }
    
        private void combineCore(int[] data,int n,int k,int[] subData){
            if(k<1||n<1||n<k)
            {
                System.out.println("the input value or their combination is illegal");
            }
    
            for(int i=n;i>=k;i--){
                subData[k-1]=data[i-1];
                if(k>1){
                    this.combineCore(data,i-1,k-1,subData);
                }else{
                    System.out.println(this.printArray(subData));
                }
            }
    
        }
    
        public static void main(String[] args){
    
            permutation per=new permutation();
            int[] data=new int[]{1,2,3,4,5,6,7};
            per.permutate(data,2);
            System.out.println("----------------------");
            per.combine(data,2);
        }
    }
  • 相关阅读:
    了解xss
    kail Windows10 远程连接解决办法
    信息收集二级域名或ip收集
    mpvue引用Echarts不渲染问题
    IIS状态码
    apicloud的tapmode用法
    JavaScript交换两个变量值的七种解决方案
    IIS express 服务的开启, 支持多个iis express
    asp.net解决跨域访问问题
    Flex 布局
  • 原文地址:https://www.cnblogs.com/dongyuanshi/p/3565262.html
Copyright © 2011-2022 走看看