您的位置:首页 > 编程语言

《编程之美》烙饼排序问题的简单实现

2012-08-14 14:07 423 查看
今天选择性地看了一下以前写的《编程之美》的部分程序,发现这个问题很有趣,而且使用STL中的vector(向量容器)和deque(双向队列)这两种数据结构可以很有效地解决这个问题。先看问题描述:

对于大小不同的一摞饼,需要将其按照从大到小的顺序摆好,其中小的在上面。翻转的限制是每次只能抓住最上面的几块饼翻转,反复几次即可得到排好序的饼。

算法:

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;
}


运行结果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: