洗牌j

 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 }

 

转载于:https://www.cnblogs.com/jintg/p/6305359.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值