把一摞烙饼按大的在下,小的在上拍好,一只手一次只能抓住上面的几张饼,把它们上下颠倒个个。反复几次后把饼排好。
问把饼排好需要的最小的次数。

问题:是看看把饼排好需要的最小次数。

找最优解的问题,可以想到用穷举法。
用递归的方式去遍历所有的翻转方式。然后找到最小的值。


可以先把最上面的两张翻一下,把次数加一,看看是不是达到要求了,如果没有的话再已经翻转过的基础上再继续递归。当顺序排好了,这是一个退出条件。

当然,书中做了优化,对当前饼的顺序做了评估,看看还有多少张饼处于不相邻的位置,给出一个评估值,如果当前已经执行的翻转次数+未来还需要翻转的次数 > 2(n-1)这是需要的最大的翻转次数时,也就可以直接退出了。


程序中可以关注一下 FindSwapCount的返回值,如果能优化其中算法,使其返回值尽量的大(当然要合理),这样就能大幅的减少递归的次数。

例如测试时饼大小的顺序是 {3,1,2},这个最少要翻两次。当前的程序需要查找 79次,如果将FindSwapCount的返回值变成2倍,这样需要查找
51次。

如果用{5,1,2,4,3}进行测试, 375289:39057,这个就比较明显了。

#include <iostream>using namespace std;int nMax = 0;
int nSearchTime = 0;void Print(int *pData, int nLen)
{int i = 0;for (i = 0; i < nLen; i++)cout << pData[i] << "  ";cout << endl;
}void Swap(int *pData, int nStart, int nEnd)
{int nTemp = 0;while (nStart < nEnd){nTemp = pData[nStart];pData[nStart] = pData[nEnd];pData[nEnd] = nTemp;nStart++;nEnd--;}
}int FindSwapCount(int* pData, int nLen)
{int n = 0, i = 0;for (i = 1; i < nLen; i++){if ((pData[i] - pData[i-1] > 1) || (pData[i] - pData[i-1] < -1)){n++;}}return n;
}bool IsOk(int *pData, int nLen)
{int i = 0;for (i = 1; i < nLen; i++){if (pData[i] < pData[i-1])return false;}return true;
}void Search(int nStep, int* pData, int nLen)
{int i = 0;int nEsti = 0;nSearchTime++;nEsti = FindSwapCount(pData, nLen);if (nStep + nEsti > 2*nLen)return;if (IsOk(pData, nLen)){if (nStep < nMax){nMax = nStep;cout << nMax << endl;}return;}for (i = 1; i < nLen; i++){Swap(pData, 0, i);Search(nStep+1, pData, nLen);Swap(pData, 0, i);}}void main()
{int value = 0;//int test[10] = {3,1,2,6,5,4,9,8,7,0};//int nLen = 10;//int test[5] = {5,1,2,4,3};//int nLen = 5;int test[3] = {3,1,2};int nLen = 3;Print(test, nLen);nMax = nLen * 2;Search(0, test, nLen);cout << nMax << "     search times: "<< nSearchTime <<endl;//Print(test, nLen);cin >> value;}

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

  1. 编程之美 烙饼问题 java实现(检测状态是否出现过)

    import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; /** ...

  2. 思维的体操——勇者斗恶龙,编程之美-烙饼排序问题,买书问题(上)

    刚开学一周,时间还不忙,这周就看了这么点东西,赶紧写下来啊. 先说烙饼排序问题,我是看了书中的解法思路之后,突然联想到其实和汉罗塔问题非常像,都可以采用递归的方式来解决问题.而我的思路则很是直接 #i ...

  3. 《编程之美》1.3一摞烙饼的排序

    <编程之美>1.3一摞烙饼的排序       本文内容主要整理自http://yangguosheng.here.blog.163.com/blog/static/111479292201 ...

  4. 《编程之美——微软技术面试心得》一摞烙饼的排序初体验

    <编程之美>读书笔记:1.3 一摞烙饼的排序 问题: 星期五的晚上,一帮同事在希格玛大厦附近的"硬盘酒吧"多喝了几杯.程序员多喝了几杯之后谈什么呢?自然是算法问题.有个 ...

  5. 【编程之美】一摞烙饼的排序

    一,问题:                     星期五的晚上,一帮同事在希格玛大厦附近的"硬盘酒吧"多喝了几杯.程序员多喝了几杯之后谈什么呢?自然是算法问题.有个同事说:&qu ...

  6. 编程之美-翻烙饼问题

    翻烙饼问题 前言 翻烙饼问题是非常经典的问题,星期五的晚上,一帮同事在希格玛大厦附近的"硬盘酒吧"多喝了几杯.程序员多喝了几杯之后谈什么呢?自然是算法问题.有个同事说: " ...

  7. 《编程之美》一摞烙饼问题探讨

    <编程之美>一摞烙饼问题探讨 这类问题我最早遇到是厨师摆盘子问题,就是厨师要把一个架子上的盘子按照从大到小排列,只能象本题中翻动烙饼的方式翻动盘子,当时我给出了这样的答案: int Fin ...

  8. 《编程之美》读书笔记(三):烙饼问题与搜索树

    <编程之美>读书笔记三:烙饼问题与搜索树 薛笛 EMail:jxuedi#gmail.com 前面已经写了一些关于烙饼问题的简单分析,但因为那天太累有些意犹未尽,今天再充实一些内容那这个问 ...

  9. 精选的一些《编程之美》相关资料

    又要到一年的招聘季了,肯定又有很多人开始啃<编程之美>了吧.这本书从开阔视野的角度来说很好,不过限于篇幅,有的问题并没有讲清楚(甚至问题叙述模棱两可.被标榜为"鼓励同面试官交流以 ...

最新文章

  1. 图论 ---- DAG删点+枚举+暴力+离线前缀异或和 J Red-Black Paths (2021 icpc网络赛第一场)
  2. page_index--template.html(0)源码
  3. Sublime Text 提示[Decode error - output not utf-8]的解决方法
  4. excel像素画教程_像素画新手教程:极简像素画角色分析
  5. mysql 内存占用过多的解决方法
  6. 前端学习(2781):底部tabber配置
  7. c#操作access,update语句不执行的解决办法
  8. 关于stm32的正交解码
  9. sas python接口_全方位比较3种数据科学工具:Python、R和SAS(附链接)
  10. E-Prime学习笔记
  11. 3 基于采样的路径规划 —— RRT算法
  12. 大学生计算机应用基础赵山林高媛,我院学生获“第四届全国大学生计算机应用能力与信息素养大赛(IC3)”全国一等奖...
  13. 【USB】USB的VID和PID
  14. 魔兽世界自建服务器,魔兽世界怀旧服
  15. 将Twitter4j与Scala结合使用以执行用户操作
  16. Shift 键的一些技巧
  17. Java字符串转Json对象
  18. 市值一夜间蒸发千亿,拼多多离不开黄峥?
  19. 解决JCE cannot authenticate the provider BC
  20. 技美 百人计划 (图形)1.1渲染流程

热门文章

  1. u盘文件看得见却打不开_U盘插入电脑能看到盘符但打不开怎么办
  2. 多功能起名查重工具微信小程序源码
  3. [STM32F103C8T6]看门狗
  4. Java面试社保系统负责模块_java面试题与答案:SAPSD面试问题、回答与注解-问题5-10...
  5. 计算机丢失libjcc dll,libjcc.dll 64位
  6. google 广告条代码
  7. fgetc和方fread读不到文件末尾出现ffffff或0时解决方法
  8. 快来给你的Hexo博客招募亿只live2d看板娘吧(๑•̀ㅂ•́)و✧
  9. [转]多媒体封装格式详解---MP4
  10. 安装并配置TrueNas存储平台