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

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

2014-02-23 20:00 288 查看
刚开学一周,时间还不忙,这周就看了这么点东西,赶紧写下来啊。

先说烙饼排序问题,我是看了书中的解法思路之后,突然联想到其实和汉罗塔问题非常像,都可以采用递归的方式来解决问题。而我的思路则很是直接

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
//#define N 10
using namespace std;

int dealPancake(vector<int> a,vector<int> b, int n)
{
int sum = 0;
for(int i = 1;i <= n;++i)
{
for(int j = 1;j <=n;++j)
{
if(b[i] == a[j])
{
reverse(a[1],a[j]);
reverse(a[1],a[n-i+1]);
sum = sum + 2;
break;
}
}
}
return sum;
}

int main()
{
vector <int> a; //从上到下每张饼构成一个数组,数值的大小表示每张饼的大小
vector <int> b; //对a
数组的全排序,标号越大,数值越大
int n;
cout << "请输入饼的数目" << endl;
cin >> n;
int m;
cout << "请输入每张饼的大小" << endl;
for(int i =1;i <= n;++i)
{
cin >> m;
a.push_back(m);
b.push_back(m);
}
sort(b[1],b
,greater<int>());
int sum ;//统计翻转次数
sum = dealPancake(a,b,n);
cout << "至少要翻转" << sum << "次";
return 0;
}
上面的程序有问题,如果哪位高手会解决,请留言谢谢!

刚开始用STL,还真是各种不会,对vector和数组总是不能分得很清楚,也正是这个程序,那个reverse()函数的运用总提示出错,看了一遍《C++标准模板库》》之后,才慢慢有点清楚了,头文件#include<algorithm>不仅仅适用于容器,还可以用于数组,之前一直处于混用的状态。

还是回到这个烙饼问题,看了书上的解法之后,它的解法分析很清楚:我们至多需要2(n-1)次翻饼就可以把所有烙饼排好序(因为第二小的烙饼排好的时候,最小的烙饼已经排在上面了),我们自然会想到使用动态规划或递归的方法来实现。既然是递归就一定有退出的条件,在这个过程中,第一个退出的条件肯定是所有的烙饼都已排好序,还有,既然2(n-1)是一个最多的翻转次数,那在算法中,如果需要的翻转次数多于这个,我们就应该放弃这个算法,直接退出。从另一个层面上来讲,既然这是一个排序问题,我们也应该利用排序的信息来处理,在反转的过程中,我们可以看看当前烙饼数组的排序情况,然后利用这些信息来帮助减少翻转次数的判断过程。 

我是在写第二遍的时候才开始看书上的源程序,但递归进行翻转的过程我始终没弄明白,希望得到指点。

for(int i =1;i < m_nCakeCnt;i++)
{
Revert(0,i);
m_ReverseCakeArraySwap[step] = i;
Search(step + 1);
Revert(0,i);

发现还是没有真正弄清楚啊
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息