标签:
1 #include<iostream> 2 using namespace std; 3 //初始化,注意两边的初始化,简化算法 4 void Init(int n , int *arr , bool * flags) 5 { 6 arr[0] = 0xfffffff; 7 for(int i = 1;i <= n;i++) 8 { 9 arr[i] = i; 10 flags[i] = false; 11 } 12 arr[n+1] = 0xfffffff; 13 } 14 //检查是否有可移动的地方 15 bool HaveMove(const int * arr ,const int iLength , int & iIndex ,const bool * flags , bool & bTemp) 16 { 17 int iMax = -1; 18 int iTemp; 19 for(int i = 1 ;i <= iLength ;i ++) 20 { 21 if(flags[i] == false && arr[i] > arr[i-1] && arr[i] > iMax) 22 { 23 iTemp = i; 24 iMax = arr[i]; 25 bTemp = false; 26 } 27 else if(flags[i] == true && arr[i] > arr[i+1] && arr[i] > iMax) 28 { 29 iTemp = i; 30 iMax = arr[i]; 31 bTemp = true; 32 } 33 } 34 if(iMax != -1) 35 { 36 iIndex = iTemp; 37 return true; 38 } 39 else 40 { 41 return false; 42 } 43 } 44 //相应的改变 45 void Move(int *arr ,int i , bool * flags , bool bTemp , int iLength) 46 { 47 int iTemp; 48 if( bTemp == false) 49 { 50 iTemp = flags[i]; 51 flags[i] = flags[i-1]; 52 flags[i-1] = iTemp; 53 54 iTemp = arr[i]; 55 arr[i] = arr[i-1]; 56 arr[i-1] = iTemp; 57 } 58 else 59 { 60 iTemp = flags[i]; 61 flags[i] = flags[i+1]; 62 flags[i+1] = iTemp; 63 64 iTemp = arr[i]; 65 arr[i] = arr[i+1]; 66 arr[i+1] = iTemp; 67 } 68 69 for(int i = 1;i <= iLength;i ++) 70 { 71 if(arr[i] > iTemp) 72 { 73 flags[i] = (flags[i] == false ? true : false); 74 } 75 } 76 } 77 void Show(const int * arr,int iLength) 78 { 79 for(int i = 1;i <= iLength ;i++) 80 { 81 cout<<(char)arr[i] <<‘ ‘; 82 } 83 cout<<endl; 84 } 85 //算法名称 86 void JonhnsonTrotter(int n) 87 { 88 int arr[100]; 89 bool flags[100]; 90 int iIndex; 91 bool bTemp; 92 Init( n , arr ,flags); 93 94 Show(arr , n); 95 while(HaveMove(arr, n , iIndex , flags , bTemp)) 96 { 97 Move(arr ,iIndex , flags , bTemp , n); 98 Show(arr , n); 99 } 100 return; 101 } 102 103 int main() 104 { 105 int iNum; 106 cin>>iNum; 107 JonhnsonTrotter(iNum); 108 return 0; 109 }
1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 //插入--分为需要移动和无需移动元素两种情况 5 void Insert(int iIndex , int iPreLength , int * arr) 6 { 7 int i; 8 if(iIndex < iPreLength) 9 { 10 for(i = iPreLength ;i > iIndex; i--) 11 { 12 arr[i] = arr[i-1]; 13 } 14 arr[i] = iPreLength + 1; 15 } 16 else 17 { 18 arr[iPreLength] = iPreLength + 1; 19 } 20 } 21 //回溯--撤销之前的移动 22 void Back(int iIndex , int iPreLength , int * arr ) 23 { 24 if(iIndex < iPreLength) 25 { 26 for(int i = iIndex ;i <= iPreLength ;i ++) 27 { 28 arr[i] = arr[i+1]; 29 } 30 } 31 } 32 //生成算法,已经有前now个元素,第now+1个元素插在哪里的问题 33 void GetArray(int num , int now ,int arr[10]) 34 { 35 if(num == now) 36 { 37 for(int i = 0;i < num ;i ++) 38 { 39 printf("%c " , arr[i]); 40 } 41 printf("\r\n"); 42 return ; 43 } 44 else 45 { 46 for(int i = 0 ;i <= now ;i ++) 47 { 48 Insert(i , now, arr); 49 GetArray(num , now + 1 , arr); 50 Back(i , now , arr); 51 } 52 } 53 } 54 int main() 55 { 56 int arr[10]; 57 memset(arr, 0 ,sizeof(arr)); 58 arr[0] = 1; 59 GetArray(4 , 1 , arr); 60 return 0; 61 }
//字典序 #include<iostream> using namespace std; //反转某一区间 void reverse(char* a, int i ,int j ) { char temp; while(i != j && i != --j) { temp = a[j]; a[j] = a[i]; a[i] = temp; i++; } } //只有实现,详细可百度 bool Permutation(char * a ,int N) { if(0 == N || 1 == N) { return false; } int i = N - 2; char temp; while(true) { if(a[i] < a[i+1]) { int j = N - 1; while(!(a[i] < a[j])) { j--; } temp = a[i]; a[i] = a[j]; a[j] = temp; reverse(a , i + 1, N); return true; } if(0 == i) { reverse(a, 0 , N); return false; } i--; } } int main() { char a[] = {1,2,3,4}; int size = sizeof(a) / sizeof(char); for(int i = 0;i < size ;i ++) { printf("%c" , a[i]); } printf("\n"); while(Permutation(a,size)) { for(int i = 0;i < size ;i ++) { printf("%c" , a[i]); } printf("\n"); } return 0; }
标签:
原文地址:http://www.cnblogs.com/KIKIKS/p/4534728.html