1 #include <iostream> 2 using namespace std; 3 #define SIZE 12 4 int data[SIZE]; 5 int data1[SIZE]; 6 int n; 7 int minstep; 8 void xipai(int m); 9 bool shun(); 10 void dfs(int step); 11 int main() 12 { 13 freopen("in.txt","r",stdin); 14 minstep=6; 15 while(scanf("%d",&n)!=EOF) 16 { 17 for(int i=0;i<n;i++) 18 { 19 cin >>data[i]; 20 data1[i]=data[i]; 21 } 22 dfs(0); 23 cout <<minstep<<endl; 24 } 25 return 0; 26 } 27 void xipai(int m) 28 { 29 int data2[SIZE]; 30 for(int i=0;i<n;i++) 31 data2[i]=data1[i]; 32 int j=0; 33 for(int i=m;i>0;i--) 34 { 35 if(i>n/2) 36 { 37 data2[n/2-j-1+n/2]=data1[n/2-j-1]; 38 data2[n/2+j-n/2]=data1[n/2+j]; 39 } 40 else 41 { 42 data2[n/2-j-1+i]=data1[n/2-j-1]; 43 data2[n/2+j-i]=data1[n/2+j]; 44 } 45 j++; 46 if(j>n/2-1) 47 break; 48 } 49 for(int i=0;i<n;i++) 50 data1[i]=data2[i]; 51 } 52 bool shun() 53 { 54 if(data1[0]<data1[1]) 55 { 56 for(int i=0;i<n-1;i++) 57 { 58 if(data1[i]>data1[i+1]) 59 return false; 60 } 61 } 62 if(data1[0]>data1[1]) 63 { 64 for(int i=0;i<n-1;i++) 65 { 66 if(data1[i]<data1[i+1]) 67 return false; 68 } 69 } 70 return true; 71 } 72 void dfs(int step) 73 { 74 if(shun()) 75 { 76 if(step<minstep) 77 minstep=step; 78 return; 79 } 80 if(step==5) 81 return; 82 int temp[SIZE]; 83 for(int i=0;i<n;i++) 84 temp[i]=data1[i]; 85 for(int i=0;i<n;i++) 86 { 87 xipai(i); 88 dfs(step+1); 89 for(int j=0;j<n;j++) 90 data1[j]=temp[j]; 91 } 92 }
原文:http://www.cnblogs.com/jintg/p/6305359.html