问题:
#include<iostream>
#include<cassert>
using namespace std;
class CPrefixSorting
{
private:
int* m_CakeArray;//烙饼信息数组
int m_nCakeCnt;//烙饼个数
int m_nMaxSwap;//最多翻转次数,即上界
int* m_SwapArray;//交换结果数组,即保存最优解的每一步交换
int* m_ReverseCakeArray; //当前翻转烙饼信息数组
int* m_ReverseCakeArraySwap;//当前翻转烙饼交换结果数组
int m_nSearch;//当前遍历次数信息
public:
CPrefixSorting()
{
m_nCakeCnt=0;
m_nMaxSwap=0;
}
void Run(int *pCakeArray,int nCakeCnt)
{
Init(pCakeArray,nCakeCnt);
m_nSearch=0;
Search(0);
}
void Init(int* pCakeArray,int nCakeCnt)
{
assert(pCakeArray!=NULL);
assert(nCakeCnt>0);
m_nCakeCnt=nCakeCnt;
m_CakeArray=new int[m_nCakeCnt];
assert(m_CakeArray!=NULL);
for(int i=0;i<m_nCakeCnt;i++)
{
m_CakeArray[i]=pCakeArray[i];
}
m_nMaxSwap=UpBound(m_nCakeCnt);
m_SwapArray=new int[m_nMaxSwap];
assert(m_SwapArray!=NULL);
m_ReverseCakeArray=new int[m_nCakeCnt];
for(int i=0;i<m_nCakeCnt;i++)
{
m_ReverseCakeArray[i]=m_CakeArray[i];
}
m_ReverseCakeArraySwap=new int[m_nMaxSwap];
}
int UpBound(int nCakeCnt)
{
return (nCakeCnt-1)*2;
}
int LowerBound(int* pCakeArray,int nCakeCnt)
{
int t,ret=0;
for(int i=1;i<nCakeCnt;i++)
{
t=pCakeArray[i]-pCakeArray[i-1];
if(t==1 || t==-1){
}
else
{
ret++;
}
}
if (ret==0 && pCakeArray[nCakeCnt-1] != nCakeCnt-1)
ret++;
return ret;
}
void Search(int step)
{
int i,nEstimate;
m_nSearch++;
nEstimate=LowerBound(m_ReverseCakeArray,m_nCakeCnt);
if(step+nEstimate>=m_nMaxSwap)
return;
if(IsSorted(m_ReverseCakeArray,m_nCakeCnt))
{
if(step<m_nMaxSwap)
{
m_nMaxSwap=step;
for(i=0;i<m_nMaxSwap;i++)
m_SwapArray[i]=m_ReverseCakeArraySwap[i];
}
return;
}
for(i=1;i<m_nCakeCnt;i++)
{
Revert(0,i);
m_ReverseCakeArraySwap[step]=i;
Search(step+1);
Revert(0,i);
}
}
bool IsSorted(int* pCakeArray,int nCakeCnt)
{
for(int i=1;i<nCakeCnt;i++)
{
if(pCakeArray[i-1]>pCakeArray[i])
{
return false;
}
}
return true;
}
void Revert(int nBegin,int nEnd)
{
assert(nEnd>nBegin);
int i,j,t;
for(i=nBegin,j=nEnd;i<j;i++,j--)
{
t=m_ReverseCakeArray[i];
m_ReverseCakeArray[i]=m_ReverseCakeArray[j];
m_ReverseCakeArray[j]=t;
}
}
void Output()
{
for (int i = 0; i < m_nMaxSwap; i++)
printf("%d\n", m_SwapArray[i]);
printf("Search Times : %d\n", m_nSearch);
printf("Total Swap times = %d\n", m_nMaxSwap);
}
};
int main()
{
int a[] = {3, 2, 1, 6, 5, 4, 9, 8, 7, 0};
CPrefixSorting test;
test.Run(a, 10);
test.Output();
system("pause");
return 0;
}