烧饼排序:递归实现 与 递归求最小翻转次数
看到一道比较有趣的题目:
https://www.cxyxiaowu.com/5040.html
有一堆大小不同的烧饼叠在一起,每次执行的操作只能是:将前x个烧饼全部翻转(逆序)
比如烧饼大小序列是 3 1 2 4 ,翻转前 x=3 个 得到序列 2 1 3 4
求一组 翻转的序列,使得初始的烧饼大小序列被 升序排序
翻转的序列可以有多种
例:
输入 3 2 4 1
翻转序列可以是:4 2 4 3
解释:
执行第一次翻转:翻转前4个
序列变为:1 4 2 3
执行第二次翻转:翻转前2个
序列变为:4 1 2 3
执行第三次翻转:翻转前4个
序列变为:3 2 1 4
执行第四次翻转:翻转前3个
序列变为:1 2 3 4
完成排序
递归求法
这题的递归体现在每次我们把最大的饼放到最后(翻转前n张饼),然后对前 n-1 张饼递归
递归思路:排序前 x 张饼
- 先找到最大的饼的下标 m
- 将前 m 张饼翻转,使得最大的饼在最前面
- 将前 x 张饼翻转,使得最大的饼在最后面
- 递归排序前 x-1 张饼
#define maxlen 1000
int a[maxlen];
int n;
void change(int i1, int i2)
{
int temp = a[i1];
a[i1] = a[i2];
a[i2] = temp;