问题:给定一组随机数字,使其从大到小排序。

要求:只能对数组做一种操作——翻转Arr[0]至Arr[n],其中n为大于0小于ArrLength的整数

解题思路:搜索树算法、递归遍历+减枝

详解:

1.将该数组构建为一颗树,假设该数组为4,2,1,3:

2.目标为如何找到序列为1,2,3,4、深度最小的子节点。

代码:

#include "stdafx.h";
class CakeSort
{
private:int* m_CakeArray;       //初始烙饼数组int m_CakeCount;        //烙饼数量int m_MaxSwap;            //交换上界int m_SwapTimes;      //已交换的次数int* m_SwapArray;       //交换信息int* m_ReverseCake;       //执行交换后的烙饼数组int* m_SwapReverseCake; //执行交换后的烙饼数组的交换信息
public:void Init(int* pCakeArray,int count);void Run(int* pCakeArray,int count);int UpperBound(int count);int LowerBound(int* pArray,int count);void Search(int step);bool IsSort(int* pArray,int count);void Reverse(int begin,int end);
};
void CakeSort::Init(int* pCakeArray,int count)
{m_CakeCount = count;m_CakeArray = new int[count];for(int i = 0 ; i < count ; i++)m_CakeArray[i] = pCakeArray[i];m_ReverseCake = new int[count];for(int i = 0 ; i < count ; i++)m_ReverseCake[i] = m_CakeArray[i];m_MaxSwap = UpperBound(count);m_SwapTimes = 0;m_SwapArray = new int[m_MaxSwap];m_SwapReverseCake = new int[m_MaxSwap];
}
int CakeSort::UpperBound(int count)
{return 2*(count - 1<span style="font-family: Arial, Helvetica, sans-serif;">);</span>
}
int CakeSort::LowerBound(int* pArray,int count)
{int ret = 0 ;int t;for(int i = 1 ; i < count ; i++){t = pArray[i] - pArray[i-1];if((t != 1) && ( t!= -1))ret++;}return ret;
}
void CakeSort::Run(int* pArray,int count)
{Init(pArray,count);Search(0);for (int i = 0; i < m_MaxSwap; i++)  printf("%d\n", m_SwapArray[i]);  printf("Search Times : %d\n", m_SwapTimes);  printf("Total Swap times = %d\n", m_MaxSwap);
}
void CakeSort::Reverse(int begin , int end)
{int i,j,temp;for(i = begin , j = end ; i < j ; i++ , j--){temp = m_ReverseCake[i];m_ReverseCake[i] = m_ReverseCake[j];m_ReverseCake[j] = temp;}
}
bool CakeSort::IsSort(int* pArray,int count)
{for(int i = 1 ; i < count ; ++i){if(pArray[i] < pArray[i-1])return false;}return true;
}
void CakeSort::Search(int step)
{m_SwapTimes++;int Est = LowerBound(m_ReverseCake,m_CakeCount);if(Est + step >= m_MaxSwap)return;if(IsSort(m_ReverseCake,m_CakeCount)){if(step <= m_MaxSwap){m_MaxSwap = step;for(int i = 0 ; i < m_MaxSwap ; i ++){m_SwapArray[i] = m_SwapReverseCake[i];}}return;}for(int i = 1 ; i < m_CakeCount ; i++){Reverse(0,i);m_SwapReverseCake[step] = i;Search(step+1);Reverse(0,i);}
}
int main()
{int a[] = {3, 2, 1, 6, 5, 4, 9, 8, 7, 0};  CakeSort s;s.Run(a,10);return 0;
}

PS:参考链接---http://blog.csdn.net/justpub/article/details/2301191

编程之美1.3-翻烙饼问题相关推荐

  1. (1.5.1.3)编程之美:一摞烙饼的排序

    问题:     星期五的晚上,一帮同事在希格玛大厦附近的"硬盘酒吧"多喝了几杯.程序员多喝了几杯之后谈什么呢?自然是算法问题.有个同事说:"我以前在餐馆打工,顾客经常点非 ...

  2. 编程之美2.10:寻找数组中的最大值和最小值

    编程之美2.10: 对于一个有N个整数组成的数组,需要比较多少次才能把最大值和最小值找出来呢? 算法的思想是: 分而治之 测试数据:---------------------------------- ...

  3. 编程之美2.1 求二进制中1的个数

    最近一段的时间,一直在看编程之美之类的算法书籍,刚开始看编程之美,感觉到难度太大,有时候也不愿意去翻动这本书,不过,经过一段时间的修炼,我也彻底的喜欢上这本书了, 书中的算法涉及到很多方面,树,链表, ...

  4. 2017“编程之美”终章:AI之战勇者为王

    编者按:8月15日,第六届微软"编程之美"挑战赛在选手的火热比拼中圆满落下帷幕."编程之美"挑战赛是由微软主办,面向高校学生开展的大型编程比赛.自2012年起, ...

  5. Java 并发编程之美:并发编程高级篇之一-chat

    借用 Java 并发编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作 ...

  6. Java 并发编程之美:并发编程高级篇之一

    借用 Java 并发编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作 ...

  7. 编程之美:编程判断两个链表是否相交

    1.问题描述 给出两个单向链表的头指针,比如h1.h2,判断两个链表是否相交.编程之美为了简化问题,假设两个链表均不带环. 如下图: 2.分析与解法 解法一:直观法,先判断第一个链表的每个节点是否在第 ...

  8. c语言找出递增子数组的长度,编程之美2.16 数组中最长递增子序列的长度

    改进的方法看的头大了却还是不清楚,哎...搞算法的苦啊,纠结啊. 编程之美这本书里面就有关于这道题的一些解法,求一个一位数组中的最长序列的长度.例如,在序列1,3,2中,最长递增序列是1,3. 这道题 ...

  9. 二叉树中节点的最大的距离(编程之美3.8)

    问题来源:<编程之美>3.8 求二叉树节点的最大距离 如果把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两个节点之间的个数. 写一个程序求一 ...

最新文章

  1. java 之 异常
  2. MySQL百万级数据分页查询及优化
  3. Hadoop 运行模式
  4. 数据结构学习笔记:顺序表的删除操作及其演化题目总结
  5. IplImage, CvMat, Mat 的关系和相互转换 再次理解 /(ㄒoㄒ)/~~
  6. php的数据模型包括,数据库中模型的分类有哪些
  7. WACV 2021 开幕,更偏重技术应用,附论文下载
  8. 配色方案|平板羽毛集,为你的下个作品做安排
  9. Python 最抢手、Java 最流行、Go 最有前途,7000 位程序员揭秘 2019 软件开发现状...
  10. oracle PL/SQL(procedure language/SQL)程序设计之异常(exception)
  11. 报错:Error in get(“GO2ONT“, envir = GO_DATA) : object ‘GO2ONT‘ not found
  12. JWT 帮助类 JWTHelper
  13. 近距离传感器(proximity sensor)
  14. 简述机器指令与微指令之间的关系_机器指令与微指令有什么联系和区别?
  15. supervisor+nginx+cesi
  16. 期货反向跟单—机器对冲与人工对冲
  17. 17-EMM Procedure 6. Handover without TAU - Part 2. X2 Handover
  18. 高频交易真的提高了市场流动性吗?
  19. 自由之城开启,Free DAO元宇宙将是开启的密钥
  20. 单向Boost PFC+全桥LLC串联谐振开关电源Matlab/simulink仿真模型 2kw功率,输出48V,谐振频率100k

热门文章

  1. Excel排序 九度教程第4题
  2. 梅特卡夫定律:社交网络的滚雪球效应
  3. 怎么让自己的网站在百度搜索中带图片显示
  4. Z世代成消费主力,还呗布局消费分期正当时
  5. GAN论文精读 P2GAN: Posterior Promoted GAN 用鉴别器产生的后验分布来提升生成器
  6. Linux系统下载vscode慢解决方法
  7. Bear and Three Balls
  8. 编写一个函数,计算两个数字的和,差,积,商
  9. 缓存微信accesstoken实现
  10. GCN(通过https://www.bilibili.com/video/BV1QK4y1t75Q?p=1share_medium=androidshare_plat=androidshare)