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

刚开学一周,时间还不忙,这周就看了这么点东西,赶紧写下来啊。

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

#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[N]数组的全排序,标号越大,数值越大
    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[n],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);
   

发现还是没有真正弄清楚啊

    原文作者:是吻过的尘埃风过
    原文地址: https://blog.csdn.net/theknotyouknow/article/details/19676155
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞