一个小逻辑题的穷举尝试
问题;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("\t"); } } } 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