• 一个小逻辑题的穷举尝试


    问题;ABCDE需要多少步才能到达EDCBA;

    移动规则:只能选取相邻的两个元素当做一个整体插入。

    例如:ABCDE;CD当做一个整体可以有CDABEACDBE ABCDEABECD(后文将会有程序自动生成);

    分析:当做NP问题穷举求解即可,第一个阶段可以实现4*4-4=12种情况;第二重可以实现12*12=144;实际有很多种重复情况;第三层即可12*144;任意序列都可以在三层内实现,这里不加证明。

    代码会给与一个递归源下生成12情况的序列数组;可以看到对角元为原序列。

    public class Demo {
    
    	public static void main(String[] args){
    	    String[] arr1  = {"A","B","C","D","E"};
    	    for(int k=0;k<4;k++){
    		    int[] ar = new int[0];//抽离了两个数值后,想办法让抽出来的三个单元有序
    		    for(int i=0;i<5;i++){
    		        if(i<k){
    		           ar = AR.arrayAppend(ar,i);
    		        }else if(i>k+1){
    		           ar = AR.arrayAppend(ar,i); 
    		        }
    		    }
    		   //动态改变数组让产生序列[ 0 a 1 b 2 c 3 ];
    		    String[][] arr2 = new String[4][];
    		    String[] ars = new String[]{arr1[ar[0]],arr1[ar[1]],arr1[ar[2]]};
    		    for(int j=0;j<4;j++){//插入第j个位置
    		         //动态改变数组让产生序列[ 0 a 1 b 2 c 3 ];
    		       arr2[j] = new String[5];
    		       arr2[j][j] = arr1[k];
    		       arr2[j][j+1] = arr1[k+1];
    		       for(int i=0;i<3;i++){
    		        if(i<j){
    		            arr2[j][i] = ars[i];
    		        }else {
    		            arr2[j][i+2] = ars[i];    
    		            }
    		       }
    		    }
    		printArray2(arr2);
    		System.out.println();
    	    }
    	 }
    	public static void printArray2(String[][] arr2){
    		for(int i=0;i<arr2.length;i++){
    		    for(int j=0;j<5;j++){
    		        System.out.print(arr2[i][j]);
    		    }
    		    System.out.print("	");
    			}
    		}
    }
    
    class AR{
    
    	public static String[] arrayAppend(String[] arr,String x){
    		String[] arr1 = new String[arr.length+1];
    		int i=0;
    		while(i<arr.length){
    			arr1[++i]= arr[++i]; 
    		}
    			arr1[arr.length] = x;
    		return arr1;
    		}
    	
    	public static int[] arrayAppend(int[] arr,int x){
    		int[] arr1 = new int[arr.length+1];
    		for(int i =0;i<arr.length;i++){
    			arr1[i]= arr[i];        
    		}
    		arr1[arr.length] = x;
       return arr1;
    	}
    	
    	public static String[][][] return12(String[] arr1){
    		String[][][] arr3 = new String[4][][];
    	    for(int k=0;k<4;k++){
    		    int[] ar = new int[0];//抽离了两个数值后,想办法让抽出来的三个单元有序
    		    for(int i=0;i<5;i++){
    		        if(i<k){
    		           ar = AR.arrayAppend(ar,i);
    		        }else if(i>k+1){
    		           ar = AR.arrayAppend(ar,i); 
    		        }
    		    }
    		    String[][] arr2 = new String[4][];
    		    String[] ars = new String[]{arr1[ar[0]],arr1[ar[1]],arr1[ar[2]]};
    		    for(int j=0;j<4;j++){//插入第j个位置
    		       arr2[j] = new String[5];
    		       arr2[j][j] = arr1[k];
    		       arr2[j][j+1] = arr1[k+1];
    		       for(int i=0;i<3;i++){
    		        if(i<j){
    		            arr2[j][i] = ars[i];
    		        }else {
    		            arr2[j][i+2] = ars[i];    
    		            }
    		       }
    		    }
    	      arr3[k] = arr2;	
    	    }
    		return arr3;
    	}
    }
    
    运行结果:

    ABCDE CABDE CDABE CDEAB
    BCADE ABCDE ADBCE ADEBC 
    CDABE ACDBE ABCDE ABECD 
    DEABC ADEBC ABDEC ABCDE 






  • 相关阅读:
    PHP IDE NetBeans代码主题和除掉竖线解决方案
    初识Python
    从LazyPhp说起
    从Pycharm说起
    准备系统地研究一下"高性能网站开发",挑战很大,希望能坚持到底!
    IIS日志分析[资源]
    见一好东西:Threaded WebDownload class with Progress Callbacks
    ASP.net Application 中使用域用户登录
    看图找错
    汉字转拼音缩写的函数(C#)
  • 原文地址:https://www.cnblogs.com/actanble/p/6713466.html
Copyright © 2020-2023  润新知