题意是选定一个位置,那个位置之前的数字全部翻转,求能翻转成从大到小排列的操作。
我觉得深搜可以a,并且可以找到最短的翻转路径,但是。。。功力不够。。。写不出来。。。
模拟,找出目前序列最大的值,将其翻向排头,再甩回排尾,完成一次操作,继续重复前面的过程,直到所有数字归位。
代码:
#include <stdio.h>
const int Maxn = 31;
int a[Maxn];
int n;
void flip(int cut)
{
printf("%d ", n - cut);
for (int i = 0; i <= cut >> 1; i++)
{
int tmp = a[i];
a[i] = a[cut - i];
a[cut - i] = tmp;
}
}
int main()
{
#ifdef LOCAL
freopen("in.txt", "r", stdin);
#endif // LOCAL
char tmp;
n = 0;
while (scanf("%d%c", &a[n++], &tmp) != EOF)
{
if (tmp == '\n')//输入结束
{
printf("%d", a[0]);//最后一个数不打印空格
for (int i = 1; i < n; i++)
printf(" %d", a[i]);
printf("\n");
int cnt = n;
while (cnt)//cnt代表最后一个数的下标,当最大数找出并归位,舍弃
{
int max = 0, cut;
for (int i = 0; i < cnt; i++)//找出最大值
{
if (max < a[i])
{
cut = i;
max = a[i];
}
}
if (cut != cnt - 1)//若最大值不在最后一个位置,翻转
{
if (cut != 0)
flip(cut);//先将最大值翻向头位
flip(cnt - 1);//翻回尾来
}
cnt--;
}
printf("0\n");
n = 0;//初始化n
}
}
return 0;
}