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

[编程之美]一摞烙饼的排序

2012-03-14 22:07 337 查看
先想了一个最简单的方法:首先对n个烙饼进行处理,找到最大的那个烙饼,将其之上的进行翻转,然后对前n个烙饼堆进行翻转;第二次操作对上面n-1个烙饼进行操作,还是找到n-1个中最大的,将其之上的进行翻转,然后对前n-1个烙饼堆进行翻转。。。这样总共进行n-1次,每次翻转两次orz

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: