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

今天选择性地看了一下以前写的《编程之美》的部分程序,发现这个问题很有趣,而且使用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;
}


运行结果如下:

发布了37 篇原创文章 · 获赞 85 · 访问量 52万+

猜你喜欢

转载自blog.csdn.net/xuanyuansen/article/details/7864561
今日推荐