一摞烙饼
来源:互联网 发布:查看阿里云ecs数据库 编辑:程序博客网 时间:2024/04/27 20:46
- 题目描述
- 代码实现
题目描述
有一摞烙饼,大小不一,编号大小表示了其大小。现在我们需要把这一摞烙饼进行排序,使得从上到下越来越大。但是排序能够进行的操作只有抓起一摞饼进行上下翻转。比如一摞饼是[1,3,5,2,0],需要的结果是[0,1,2,3,5]。能够进行比如[5,3,1,2,0],然后再翻转一次就是[0,2,1,3,5]。这种情况下,最多需要2(n-1)次翻转。
代码实现
#include "stdafx.h"#include <iostream>#include <cassert>using namespace std;class CPrefixSorting {public: CPrefixSorting() : cakesCount(0), cakesArray(NULL), searchCount(0), curCakesArrayReverse(NULL), cakesArrayReverse(NULL), reversesCount(0) {} ~CPrefixSorting(); void Run(int *, int);private: void Init(int *, int); void Search(int *, int); void PrintResult(void); int UpperBound(); int LowerBound(int *); bool IsSorted(int *); void Reverse(int *, int, int);private: int cakesCount; // The number of cakes. int *cakesArray; // The cakes array. int searchCount; // The counter of search steps. int *curCakesArrayReverse; // The current reverse information. int *cakesArrayReverse; // The result reverse information. int reversesCount; // The counter of reverses.};CPrefixSorting::~CPrefixSorting() { if (cakesArray) delete [] cakesArray; if (curCakesArrayReverse) delete [] curCakesArrayReverse; if (cakesArrayReverse) delete [] cakesArrayReverse;}void CPrefixSorting::Init(int *pCakes, int cnt) { assert(NULL != pCakes && cnt > 0); cakesCount = cnt; cakesArray = new int[cakesCount]; assert(NULL != cakesArray); for (int i = 0; i < cakesCount; ++i) { cakesArray[i] = pCakes[i]; } reversesCount = UpperBound(); curCakesArrayReverse = new int[reversesCount]; assert(NULL != curCakesArrayReverse); cakesArrayReverse = new int[reversesCount]; assert(NULL != cakesArrayReverse); searchCount = 0;}int CPrefixSorting::UpperBound() { return 2 * cakesCount;}int CPrefixSorting::LowerBound(int *pCakesArray) { int count = 0; for (int i = 0; i < cakesCount - 1; ++i) { int diff = pCakesArray[i] - pCakesArray[i + 1]; if (-1 != diff && 1 != diff) { ++count; } } return count;}bool CPrefixSorting::IsSorted(int *pCakesArray){ for (int i = 0; i < cakesCount - 1; ++i) { if (pCakesArray[i] > pCakesArray[i + 1]) { return false; } } return true;}void CPrefixSorting::Reverse(int *pCakesArray, int start, int end){ assert(start < end); while (start < end) { int tmp = pCakesArray[start]; pCakesArray[start] = pCakesArray[end]; pCakesArray[end] = tmp; ++start; --end; }}void CPrefixSorting::Search(int *pCakesArray, int step){ ++searchCount; if (LowerBound(pCakesArray) + step >= reversesCount) { return; } if (IsSorted(pCakesArray) && step < reversesCount) { reversesCount = step; for (int i = 0; i < reversesCount; ++i) { cakesArrayReverse[i] = curCakesArrayReverse[i]; cout << curCakesArrayReverse[i] << " "; } cout << endl; return; } for (int i = 1; i < cakesCount; ++i) { int *cakesArrayTmp = new int[cakesCount]; assert(NULL != cakesArrayTmp); for (int j = 0; j < cakesCount; ++j) { cakesArrayTmp[j] = pCakesArray[j]; } Reverse(cakesArrayTmp, 0, i); curCakesArrayReverse[step] = i; Search(cakesArrayTmp, step + 1); if (cakesArrayTmp) { delete [] cakesArrayTmp; } }}void CPrefixSorting::PrintResult(){ cout << "The search times is " << searchCount << endl; cout << "The least reverse times is " << reversesCount << endl; cout << "The reverse process is:" << endl; for (int i = 0; i < reversesCount; ++i) { cout << cakesArrayReverse[i] << " "; } cout << endl;}void CPrefixSorting::Run(int *pCakes, int cnt){ // 初始化 Init(pCakes, cnt); // 搜索 Search(cakesArray, 0); // 打印结果 PrintResult();}int _tmain(int argc, _TCHAR* argv[]){ // 需要排列的数组 int arry[] = {6, 8, 9, 5, 1, 7, 11, 10, 2, 3, 4, 12}; CPrefixSorting prefixSorting; prefixSorting.Run(arry, sizeof(arry) / sizeof(arry[0])); return 0;}
对于三个饼,一个全焦、一个半焦、一个完好。第一面是焦,那么是全焦的概率为: 2/3。
参考链接:
http://blog.csdn.net/yahohi/article/details/7448676
0 0
- 一摞烙饼
- 一摞烙饼的排序
- 一摞烙饼的问题
- 一摞烙饼的排序
- 一摞烙饼的排序
- 一摞烙饼的排序
- 一摞烙饼的排序
- 一摞烙饼的排序(0621)
- 1.3一摞烙饼的问题
- 编程之美 一摞烙饼问题
- C++一摞烙饼的问题
- 一摞烙饼的排序(搜索树)
- 编程之美:一摞烙饼排序
- 编程之美 - 一摞烙饼的排序
- 编程之美 - 读书笔记 - 一摞烙饼的排序问题
- 《编程之美》一摞烙饼问题探讨
- 编程之美 一摞烙饼的排序问题
- 编程之美:一摞烙饼的排序
- Xunsearch搭建及使用
- spring cloud-构建微服务架构的网关(API GateWay)
- iOS获取键盘弹出高度,监听键盘弹出退出
- 六、AngularJS 之事件指令
- android实现点击2下退出程序
- 一摞烙饼
- datatable search 里的input中的placeholder效果代码
- 关于qt读取MD5加密的文件
- 两个整数相除求%比,保留两位小数
- Android跨进程通信
- linux(ubuntu)安装软件出现You might want to run 'apt-get -f install' to correct these解决
- 设计模式-备忘录模式
- mxArray数据类型
- 里氏七大原则