问题描述:
烙饼问题可以简化为对一段由n个无重复的整数组成的无序数组a[n]进行排序。排序要求每次只能对a[0]~a[i]部分的数组进行翻转(0 < i < n),最终完成排序。
输入:数组大小n;n个整数。
输出:最小递归查找次数m;每次翻转位置j0j1…jm-1。
问题思考:
烙饼排序这部分,主要考量的是对递归函数的使用。
而搜索上界与搜索下界则可以一定程度上提高代码的运行效率,减少搜索次数。
递归流程如下:
①首先进行0~i的翻转
②记录第step步翻转位置i
③然后进行下一层翻转
④调用递归返回之后,再进行一次0~i的翻转,保持数组进入本次循环时的顺序
①i++,进行0~i+1的翻转
…
for (int i = 1; i < m_nCakeCnt; i++)
{
Revert(0, i);
m_ReverseCakeArraySwap[step] = i;
Search(step + 1);
Revert(0, i);
}
稍微修改代码之后可以发现,最小翻转的解并不是唯一的。
测试输入:10,{ 5, 9, 4, 1, 2, 0, 8, 7, 6, 3 }
输出有效最优解:
14849278
15183931
15218393
15839312
19385312
19465853
19484278
19615285
|Search Times| : 159193
Total Swap times = 8
完整代码如下:
#include <stdio.h>
#include "stdafx.h"
#include "afx.h"
class CPrefixsorting
{
public:
CPrefixsorting()
{
m_nCakeCnt = 0;
m_nMaxSwap = 0;
}
void Run(int* pCakeArray, int nCakeCnt)
{
Init(pCakeArray, nCakeCnt);
m_nSearch = 0;
Search(0);
}
//输出烙饼具体翻转的次数
void Output()
{
for (int i = 0; i < m_nCakeCnt; i++)
{
printf("%d", m_ReverseCakeArray[i]);
}
printf("\n");
for (int i =