[编程之美]一摞烙饼的排序
2012-03-14 22:07
337 查看
先想了一个最简单的方法:首先对n个烙饼进行处理,找到最大的那个烙饼,将其之上的进行翻转,然后对前n个烙饼堆进行翻转;第二次操作对上面n-1个烙饼进行操作,还是找到n-1个中最大的,将其之上的进行翻转,然后对前n-1个烙饼堆进行翻转。。。这样总共进行n-1次,每次翻转两次orz
maybe wrong!!
maybe wrong!!
#include <iostream> using namespace std; int* Cake; int cake_num; int max_swap; int* swap_info; int search_num; int UpperBound(int num) { return (num-1)*2; } void Init() { cout <<"enter the number of cakes:"; cin >>cake_num; Cake=new int[cake_num]; cout <<endl<<"enter diameter of each cake:"; for(int i=0;i<cake_num;++i) cin >>Cake[i]; max_swap=UpperBound(cake_num); swap_info=new int[max_swap]; search_num=0; } int LowerBound(int num) { int t,cnt=0; for(int i=1;i<num;++i) { t=Cake[i]-Cake[i-1]; if(t==1 || t==-1) { } else cnt++; } return cnt; } bool IsSorted() { for(int i=0;i<cake_num-1;++i) { if(Cake[i]>Cake[i+1]) return false; } return true; } void Reverse(int end) { for(int i=0;i<=(end+1)/2-1;++i) { int tmp=Cake[i]; Cake[i]=Cake[end-i]; Cake[end-i]=tmp; } } void Search(int step) { int nEstimate; search_num++; nEstimate=LowerBound(cake_num); if(step+nEstimate>max_swap || step>=max_swap) return; if(IsSorted()) { if(step<max_swap) max_swap=step; return; } for(int i=1;i<cake_num;++i) { Reverse(i); swap_info[step]=i; Search(step+1); Reverse(i); } } void Output() { for(int i=0;i<cake_num;++i) cout <<Cake[i]<<" "; cout <<endl; } int main() { Init(); Search(0); Output(); return 0; }
相关文章推荐
- 编程之美---一摞烙饼的排序
- 编程之美 - 一摞烙饼的排序
- 【编程之美】一摞烙饼的排序
- [编程之美]一摞烙饼的排序
- 【编程之美】一摞烙饼的排序
- 编程之美-一摞烙饼的排序 《编程之美》读书笔记02: 1.3 一摞烙饼的排序
- 编程之美 一摞烙饼的排序问题
- 编程之美 - 读书笔记 - 一摞烙饼的排序问题
- 读书笔记之编程之美 - 1.3 一摞烙饼的排序
- 编程之美-一摞烙饼的排序方法整理
- 一摞烙饼的排序问题--读书笔记(2)
- 编程之美1.3 一摞烙饼的排序(扩展问题)
- 一摞烙饼的排序----《编程之美》读书笔记
- 编程之美:一摞烙饼的排序
- 编程之美:一摞烙饼排序
- 编程之美读书笔记_1.3 一摞烙饼的排序_程序源代码
- 编程之美-- 烙饼排序问题
- 一摞烙饼的排序(搜索树)
- 编程之美之一摞烙饼的排序1
- 思维的体操——勇者斗恶龙,编程之美-烙饼排序问题,买书问题(上)