《编程之美》烙饼排序问题的简单实现
2012-08-14 14:07
423 查看
今天选择性地看了一下以前写的《编程之美》的部分程序,发现这个问题很有趣,而且使用STL中的vector(向量容器)和deque(双向队列)这两种数据结构可以很有效地解决这个问题。先看问题描述:
对于大小不同的一摞饼,需要将其按照从大到小的顺序摆好,其中小的在上面。翻转的限制是每次只能抓住最上面的几块饼翻转,反复几次即可得到排好序的饼。
算法:
1、按照位置从底向上处理,先找到位置i开始最大的饼
2、判断其是否在最上面,如果是则翻转到位置i,如果不是则先将其翻转到最上面,再翻转到位置i。
3、直到处理到最顶端,算法结束。
翻转过程即:
1、将cookie中的饼从后面弹出,从后面放入cookiestore;
2、将cookiestore中的饼从前面弹出,从后面放入cookie;
其中cookie为向量容器,cookiestore为双向队列。
详细代码如下:
运行结果如下:
对于大小不同的一摞饼,需要将其按照从大到小的顺序摆好,其中小的在上面。翻转的限制是每次只能抓住最上面的几块饼翻转,反复几次即可得到排好序的饼。
算法:
1、按照位置从底向上处理,先找到位置i开始最大的饼
2、判断其是否在最上面,如果是则翻转到位置i,如果不是则先将其翻转到最上面,再翻转到位置i。
3、直到处理到最顶端,算法结束。
翻转过程即:
1、将cookie中的饼从后面弹出,从后面放入cookiestore;
2、将cookiestore中的饼从前面弹出,从后面放入cookie;
其中cookie为向量容器,cookiestore为双向队列。
详细代码如下:
// LaoBingReverse.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <iostream> #include <vector> #include <deque> using namespace std; inline void PrintInfo(vector<int>& cookies,int &citer) { citer++; cout<<"Iterate:"<<citer<<endl<<"-----------------"<<endl; cout<<"Cookies:"; for (vector<int>::iterator idx=cookies.begin();idx!=cookies.end();idx++) { cout<<*idx<<" "; } cout<<endl; cout<<"------------------------------------------"<<endl; }; inline void CookieReverse(vector<int>& cookies, deque<int>& cookiestore,int &flag,int&cookienum) { int tempcookie; for (int j=cookienum-1;j>=flag;j--) { tempcookie=cookies[j]; cookies.pop_back(); cookiestore.push_back(tempcookie); } int storesize=cookiestore.size(); for (int z=0;z<storesize;z++) { tempcookie=cookiestore.front(); cookiestore.pop_front(); cookies.push_back(tempcookie); } }; int _tmain(int argc, _TCHAR* argv[]) { cout<<"enter your cookies with 0 to stop"<<endl; vector<int> cookies; int temp=1; while (temp !=0){ cin>>temp; if (temp!=0){ cookies.push_back(temp); for (vector<int>::iterator idx=cookies.begin();idx!=cookies.end();idx++) { cout<<*idx<<" ";} cout<<endl; } } cout<<"cookies order is"<<endl; for (vector<int>::iterator idx=cookies.begin();idx!=cookies.end();idx++) { cout<<*idx<<" ";} cout<<endl; deque<int> cookiestore; int cookienum=cookies.size(); int citer=0; for (int i=0;i<cookienum;i++) { int maxcookie=0,pos=0;//从位置i起,当前未处理的最大的饼和其所处位置// for (int m=i;m<cookienum;m++) if (cookies[m]>maxcookie){ maxcookie=cookies[m]; pos=m;} if (pos!=i)//如果这个最大的饼不在其位置上则需要处理// { if (pos!=cookienum-1)//如果这个最大的饼不在所有饼的最上面,则首先需要将其翻转上来// { CookieReverse(cookies,cookiestore,pos,cookienum); PrintInfo(cookies,citer); } //否则直接将其翻转到其应处位置即可// CookieReverse(cookies,cookiestore,i,cookienum); PrintInfo(cookies,citer); } } return 0; }
运行结果如下:
相关文章推荐
- 《编程之美》读书笔记(二):烙饼的排序问题(Java实现)
- 关于烙饼排序问题的算法与Java实现
- 《编程之美》之摞烙饼的排序问题
- 《编程之美》读书笔记(二): 一摞烙饼的排序问题
- 编程之美——烙饼排序问题
- 编程之美——烙饼排序问题
- 关于《编程之美》中买书问题动态规划Java简单实现
- 《编程之美》 -- 中国象棋将帅问题和一摞烙饼的排序
- 排序问题的简单实现!
- 《编程之美》读书随笔之三:一摞烙饼的排序问题
- 《编程之美》读书笔记(三): 一摞烙饼的排序问题
- 编程之美1.3 一摞烙饼的排序(扩展问题)
- 问题:关于贴友一个用js传递value默认值的简单实现
- 编程之美1.3 一摞烙饼的排序
- RecyclerView上下拖动条目排序,左右划出屏幕删除条目的最简单的实现
- java字符串数组进行大小排序的简单实现
- 简单实现Redis缓存中的排序功能
- android下实现英汉(汉英)排序的简单实现
- 三种简单排序用java实现(选择排序,冒泡排序,插入排序)
- (数据结构排序的实验四)快速,冒泡,简单选择,直接插入排序的c语言实现!!