思维的体操——勇者斗恶龙,编程之美-烙饼排序问题,买书问题(上)
2014-02-23 20:00
288 查看
刚开学一周,时间还不忙,这周就看了这么点东西,赶紧写下来啊。
先说烙饼排序问题,我是看了书中的解法思路之后,突然联想到其实和汉罗塔问题非常像,都可以采用递归的方式来解决问题。而我的思路则很是直接
刚开始用STL,还真是各种不会,对vector和数组总是不能分得很清楚,也正是这个程序,那个reverse()函数的运用总提示出错,看了一遍《C++标准模板库》》之后,才慢慢有点清楚了,头文件#include<algorithm>不仅仅适用于容器,还可以用于数组,之前一直处于混用的状态。
还是回到这个烙饼问题,看了书上的解法之后,它的解法分析很清楚:我们至多需要2(n-1)次翻饼就可以把所有烙饼排好序(因为第二小的烙饼排好的时候,最小的烙饼已经排在上面了),我们自然会想到使用动态规划或递归的方法来实现。既然是递归就一定有退出的条件,在这个过程中,第一个退出的条件肯定是所有的烙饼都已排好序,还有,既然2(n-1)是一个最多的翻转次数,那在算法中,如果需要的翻转次数多于这个,我们就应该放弃这个算法,直接退出。从另一个层面上来讲,既然这是一个排序问题,我们也应该利用排序的信息来处理,在反转的过程中,我们可以看看当前烙饼数组的排序情况,然后利用这些信息来帮助减少翻转次数的判断过程。
我是在写第二遍的时候才开始看书上的源程序,但递归进行翻转的过程我始终没弄明白,希望得到指点。
发现还是没有真正弄清楚啊
先说烙饼排序问题,我是看了书中的解法思路之后,突然联想到其实和汉罗塔问题非常像,都可以采用递归的方式来解决问题。而我的思路则很是直接
#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);
发现还是没有真正弄清楚啊
相关文章推荐
- 关于指针的一些事情
- 动易2006序列号破解算法公布
- C#数据结构与算法揭秘二
- C/C++数据对齐详细解析
- C++中引用的使用总结
- C与C++之间相互调用实例方法讲解
- C++中引用(&)的用法与应用实例分析
- 浅析STL中的常用算法
- 解析C++ 浮点数的格式化输出
- 深入分析C++中几个最不常用的关键字
- c++中inline的用法分析
- 深入解析C++ Data Member内存布局
- 从汇编看c++中默认构造函数的使用分析
- 关于C++中的友元函数的一些总结
- C++的sstream标准库详细介绍
- 基于C++自动化编译工具的使用详解
- 浅谈C++中的string 类型占几个字节
- C/C++ 宏详细解析
- 深入分析C++中两个大数相乘结果不正确的问题
- 探讨C++中数组名与指针的用法比较分析