




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
/ 编程之美之一摞烙饼.cpp : 定义控制台应用程序的入口点。/ 不同的程序会得到不同的结果吗?有个程序能得到不同的结果,但后来证明他的结果是错的/该算法有点在于在于找最少的交换次数,不是在于用最少的时间进行排序,此算法的排序时间不是最少的。因为算法的查找时间太长了。#include stdafx.h#include #include #include #include using namespace std;#define N 10/7class Cakeint nCakeNum;int *nCakeArr;/有用吗?int nMaxSwap;/实际进行的最大的交换次数int *nCakeResultArr;/存放在哪里进行了交换,存放的是编号int *nCakeReverseArr;/几乎所有的操作都是对它进行操作。int *nCakeReverseResultArr;/用来记录找到的结果int nSearch;public:Cake()nCakeNum=0;nMaxSwap=0;nCakeArr=NULL;/没用吧nCakeResultArr=NULL;nCakeReverseArr=NULL;nCakeReverseResultArr=NULL;coutin construstendl;Cake()/析构函数自动运行,自动释放对象所占用的资源,不可以再用delete语句了(与编程之美书上不同)。/if(nCakeArr!=NULL) delete nCakeArr;/ if(nCakeResultArr!=NULL) delete nCakeResultArr;/ if(nCakeReverseArr!=NULL) delete nCakeReverseArr;/if(nCakeReverseResultArr!=NULL) delete nCakeReverseResultArr;void Run()/int *nCakeArr, int nCakeNum/Init(nCakeArr,nCakeNum);/nSearch=0;Search(0);void Output() constfor(int i=0;inMaxSwap;i+)coutnCakeReverseResultArri ;coutendl最大的交换次数是:nMaxSwapendl;coutsearch times are :nSearchendl;void PrintArr()for(int i=0;inCakeNum;i+)coutnCakeArri ;coutendl;void PrintReverseArr()for(int i=0;inCakeNum;i+)coutnCakeReverseArri ;coutendl;void Init(int *pCakeArr, int pCakeNum)nSearch = 0;nCakeNum = pCakeNum;nCakeArr = new intnCakeNum;assert(nCakeArr);for(int i=0;inCakeNum;i+)nCakeArri = pCakeArri;/init 有用吗?nMaxSwap = UpperBound(nCakeNum);nCakeResultArr = new intpCakeNum;assert(nCakeResultArr);nCakeReverseResultArr = new intnMaxSwap;assert(nCakeReverseResultArr);nCakeReverseArr = new intnCakeNum;assert(nCakeReverseArr);for(int i=0;inCakeNum;i+)nCakeReverseArri = pCakeArri;/initprivate:int UpperBound(int pCakeNum)return 2*(pCakeNum-2)+1;/原来是2*(pCakeNum-1) 改完这search times 由原来的715减少到589int LowerBound(int *pCakeArr, int pCakeNum)int num=1;/应该是1.因为当最后一个不在其有序时对应的位置时,还要多翻转一次,当这由0改成1后,search times 由原来的4081减少到715for(int i=1;ipCakeNum;i+)if(pCakeArri-pCakeArri-1=1)|(pCakeArri-pCakeArri-1=-1);elsenum+;return num;bool IsSorted(int *pCakeArr, int pCakeNum)for(int i=1;ipCakeNum;i+)if(pCakeArripCakeArri-1)return 0;return 1;void Reverse(int *nCakeReverseArr,int begin,int end)/ operate nCakeReverseArrint temp;assert(beginend);for(int i=begin,j=end;inMaxSwap|step=nMaxSwap) /加后面的或语句运行次数4081,不加4129return ;if(IsSorted(nCakeReverseArr,nCakeNum)if(stepnMaxSwap)/此算法找最少的翻转次数,不是最小的排序时间。解释:如果数组已经是有序的了,并且当前的步骤少于最大的翻转次数,更新当前的翻转次数,并把当前的结果记录下来。nMaxSwap = step;for(int i=0;inMaxSwap;i+)nCakeReverseResultArri=nCakeResultArri;/为什么用nCakeReverseResultArr?因为nCakeResultArr本函数返回后还会变,所以不能用其存储最后的结果/若果当前的翻转次数没有原来的少,不更新,只是返回。return ;for(int i=1;inCakeNum;i+)Reverse(nCakeReverseArr,0,i);nCakeResultArrstep=i;/保存结果,记录从哪开始翻转的Search(step+1);Reverse(nCakeReverseArr,0,i);return ;/myPizzaint _tmain(int argc, _TCHAR* argv)Cake cake1;/int arrbN=7,3,5,4,2,1,6;int arrbN=5,6,1,2,3,4,9,8,7,0;int *arr = new intN;for(int i=0;iN;i+)arri=arrbi;cake1.Init(arr,N);cake1.PrintArr();cake1.Run();cake1.PrintReverseArr();/作为 递归的数组 遍历所有的分支 到最后没有变化 只是在遍历时把符合条件的存储起来cake1.Output();/cake1.PrintArr();delete arr;/ 可以不用delete语句删除,不会报错system(pause); return 0;/*/1.3_pancake_1.cpp by flyinghearts##include#include#include#includeusing namespace std;class Pancake vector cake; /当前各个烙饼的状态 vector cake_swap; /每次翻转的烙饼位置 vector result; /最优解中,每次翻转的烙饼位置 vector cake_order; /第step+1次翻转时,翻转位置的优先顺序 int max_size; /预分配数组大小 int min_swap; /最优解的翻转次数 int min_swap_init; /最优解的翻转次数初始值 int count_search; /search_cake被调用次数 int count_reverse; /reverse_cake被调用次数 int cake_size; /要处理的烙饼数组大小 const int *cake_old; /要处理的原烙饼数组 bool not_turn_back; /是否允许翻回上一个状态 void search_cake(int size, int step, int least_swap_old); void reverse_cake(int index); /翻转0到index间的烙饼 Pancake(const Pancake&); Pancake& operator=(const Pancake&);public: Pancake(int size=0):max_size(0) init(size); void init(int size=0); void print() const; void process(); /显示最优解,翻转过程 int run(const int cake_arr, int size, bool not_turn_back_=1, bool show=1);void Pancake:init(int size) if (sizemax_size) max_size=size; cake.resize(size); cake_swap.resize(size*2); result.resize(size*2); cake_order.resize(size*size*2); min_swap=0; min_swap_init=0; count_search=0; count_reverse=0; cake_size=0; cake_old=NULL; not_turn_back=true;void Pancake:print() const if (min_swap0) if (not_turn_back) cout turn back to last state: disallowed.n; else cout turn back to last state: allowed.n; cout minimal_swap initial: min_swap_init final: min_swap nsearch/reverse function was called: count_search / count_reverse timesnsolution: ; for (int i=0;imin_swap; +i) cout resulti ; cout0 & cake_size0 & cake_old != NULL) cake.assign(cake_old, cake_old+cake_size); int i,j; const int WIDTH=3; cout old: ; for (j=0; jcake_size; +j) cout setw(WIDTH) cakej ; coutn; for (i=0; imin_swap; +i) reverse_cake(resulti); cout setw(WIDTH) i+1 - setw(WIDTH) resulti: ; for (j=0; jcake_size; +j) cout setw(WIDTH) cakej ; coutn; coutnn; void Pancake:reverse_cake(int index) +count_reverse; int *beg=&cake0, *end=&cake0+index; int tmp; while(begend) tmp = *beg; *beg+ = *end; *end- = tmp; int Pancake:run(const int cake_arr, int size, bool not_turn_back_, bool show) count_search=0; count_reverse=0; min_swap=0; not_turn_back = not_turn_back_; cake_size=0; cake_old=NULL; if (cake_arr=NULL | size1 & size-1=cake_arrsize-1) -size; /去除末尾已就位的烙饼 if (sizemax_size) init(size+16); cake.assign(cake_arr,cake_arr+size); cake_size=size; cake_old=cake_arr; int i, least_swap=0, sz=size-1, *p=&result0; while (sz0) /先计算一个可能解 for (i=0; i0 & sz=cakesz) -sz; cake.assign(cake_arr,cake_arr+size); /恢复原来的数组 cake.push_back(size); /多放一个烙饼,避免后面的边界判断 cake_swap0=0; /为方便起见,假设第0步翻转的烙饼编号为0 for (i=0,least_swap=0; i2) least_swap+; /等同于if (cakei-cakei+11 | cakei-cakei+11 & size-1=cakesize-1) -size; /去除末尾已就位的烙饼 int least_swap=least_swap_old; for (int pos=1, last_swap=cake_swapstep+; possize; +pos) if (not_turn_back & pos
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年无人机驾驶员职业技能考核试卷及答案(无人机遥控操作)
- 2025年电梯维修工程师资格考试试题及答案解析
- 高校合同审计报告模板(3篇)
- 高清柔性屏采购合同模板(3篇)
- 高空瓦匠施工合同范本(3篇)
- 爱婴医院考试试题及答案
- 卫生健康委员会疾病预防控制体系建设合同
- 汽修厂汽车维修工人劳动合同与职业发展规划
- 专业市场店铺股份收购及供应链整合协议
- 地下商场商铺产权转让协议
- 2025-2026学年赣美版(2024)小学美术二年级上册(全册)教学设计(附目录P126)
- 2025年度全国保密教育线上培训考试题库及答案(完整版)
- 流感疫苗接种课件
- 题型专攻:平行线分线段成比例【八大题型】(原卷版)
- 2025年南京市事业单位招聘考试卫生类预防医学专业知识试题
- 案件(线索)移送登记表
- 2021年全国质量奖现场汇报材料课件
- 《组织学与胚胎学》课件02细胞
- 名词性从句公开课
- 最新北师大版100以内加减法口算和竖式计算
- 《窗边的小豆豆》阅读分享
评论
0/150
提交评论