烧饼排序:递归实现 与 递归求最小翻转次数

本文介绍了烧饼排序问题,即通过翻转操作将大小不一的烧饼序列升序排列。提出了递归方法来解决这个问题,并详细阐述了递归思路:找出最大烧饼的位置进行翻转,然后递归处理剩余烧饼。同时,提出了思考题,探讨如何求解最短的翻转序列,可以通过递归加状态重置的穷举方法来实现。
摘要由CSDN通过智能技术生成

烧饼排序:递归实现 与 递归求最小翻转次数

看到一道比较有趣的题目:
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;
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值