第一章 游戏之乐 一摞饼的排序

本文介绍了一种烙饼排序算法的实现,详细解释了如何通过翻转操作将大小不同的烙饼按要求排列,并展示了具体的代码实现及输出过程。

要求:大的在下面,小的在上面,输出颠倒过程


/****************************************************************/

//

// 烙饼排序实现

//

/****************************************************************/

class CPrefixSorting

{

public:

 

    CPrefixSorting()   

     {

         m_nCakeCnt = 0;

         m_nMaxSwap = 0;

     }

 

   ~CPrefixSorting()

    {

          if(m_CakeArray != NULL )

          {

              delete m_CakeArray; 

          }

          if(m_SwapArray != NULL )

          {

              delete m_SwapArray; 

          }

          if(m_ReverseCakeArray != NULL )

          {

              delete m_ReverseCakeArray; 

          }

          if(m_ReverseCakeArraySwap != NULL )

          {

              delete m_ReverseCakeArraySwap; 

          }

     }

 

     //

     // 计算烙饼翻转信息

     //@param

     // pCakeArray   存储烙饼索引数组

     // nCakeCnt     烙饼个数

     //

     voidRun(int* pCakeArray, int nCakeCnt)

     {

         Init(pCakeArray, nCakeCnt);

 

         m_nSearch = 0;

         Search(0);

     }

 

     //

     // 输出烙饼具体翻转的次数

     //

     voidOutput()

     {

         for(int i = 0; i < m_nMaxSwap; i++)

          {

              printf("%d ", m_arrSwap[i]);

          }

       

         printf("\n |Search Times| : %d\n", m_nSearch);

         printf("Total Swap times = %d\n", m_nMaxSwap);

     }

 

private:

 

     //

     // 初始化数组信息

     //@param

     // pCakeArray   存储烙饼索引数组

     // nCakeCnt     烙饼个数

     //

     voidInit(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 = newint[m_nMaxSwap + 1];

         Assert(m_SwapArray != NULL);

 

          // 初始化中间交换结果信息

         m_ReverseCakeArray = new int[m_nCakeCnt];

         for(i = 0; i < m_nCakeCnt; i++)

          {

              m_ReverseCakeArray[i] = m_CakeArray[i];

          }

         m_ReverseCakeArraySwap = new int[m_nMaxSwap];

     }

   

   

     //

     // 寻找当前翻转的上界

     //

     //

     intUpBound(int nCakeCnt)

     {

          return nCakeCnt*2;

     }

 

     //

     // 寻找当前翻转的下界

     //

     //

     intLowerBound(int* pCakeArray, int nCakeCnt)

     {

          intt, ret = 0;

 

          // 根据当前数组的排序信息情况来判断最少需要交换多少次

         for(int i = 1; i < nCakeCnt; i++)

          {

              // 判断位置相邻的两个烙饼,是否为尺寸排序上相邻的

              t = pCakeArray[i] - pCakeArray[i-1];

              if((t == 1) || (t == -1))

              {

              }

              else

              {

                   ret++;

              }

          }

         return ret;

     }

 

     // 排序的主函数

     voidSearch(int step)

     {

          inti, 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_arrSwap[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);

          }

     }

     //

     // true : 已经排好序

     // false : 未排序

     //

     bool IsSorted(int* pCakeArray, intnCakeCnt)

     {

          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;

          }

     }

 

private:

 

     int* m_CakeArray;      // 烙饼信息数组

     int m_nCakeCnt;        // 烙饼个数

     int m_nMaxSwap;        // 最多交换次数。根据前面的推断,这里最多为

                                // m_nCakeCnt * 2

     int* m_SwapArray;      // 交换结果数组

 

     int* m_ReverseCakeArray;         // 当前翻转烙饼信息数组

     int* m_ReverseCakeArraySwap;     // 当前翻转烙饼交换结果数组

     int m_nSearch;                  // 当前搜索次数信息

};


源码来自:https://pan.quark.cn/s/a3a3fbe70177 AppBrowser(Application属性查看器,不需要越狱! ! ! ) 不需要越狱,调用私有方法 --- 获取完整的已安装应用列表、打开和删除应用操作、应用运行时相关信息的查看。 支持iOS10.X 注意 目前AppBrowser不支持iOS11应用查看, 由于iOS11目前还处在Beta版, 系统API还没有稳定下来。 等到Private Header更新了iOS11版本,我也会进行更新。 功能 [x] 已安装的应用列表 [x] 应用的详情界面 (打开应用,删除应用,应用的相关信息展示) [x] 应用运行时信息展示(LSApplicationProxy) [ ] 定制喜欢的字段,展示在应用详情界面 介绍 所有已安装应用列表(应用icon+应用名) 为了提供思路,这里只用伪代码,具体的私有代码调用请查看: 获取应用实例: 获取应用名和应用的icon: 应用列表界面展示: 应用列表 应用运行时详情 打开应用: 卸载应用: 获取info.plist文件: 应用运行时详情界面展示: 应用运行时详情 右上角,从左往右第一个按钮用来打开应用;第二个按钮用来卸载这个应用 INFO按钮用来解析并显示出对应的LSApplicationProxy类 树形展示LSApplicationProxy类 通过算法,将LSApplicationProxy类,转换成了字典。 转换规则是:属性名为key,属性值为value,如果value是一个可解析的类(除了NSString,NSNumber...等等)或者是个数组或字典,则继续递归解析。 并且会找到superClass的属性并解析,superClass如...
基于遗传算法辅助异构改进的动态多群粒子群优化算法(GA-HIDMSPSO)的LSTM分类预测研究(Matlab代码实现)内容概要:本文研究了一种基于遗传算法辅助异构改进的动态多群粒子群优化算法(GA-HIDMSPSO),并将其应用于LSTM神经网络的分类预测中,通过Matlab代码实现。该方法结合遗传算法的全局搜索能力与改进的多群粒子群算法的局部优化特性,提升LSTM模型在分类任务中的性能表现,尤其适用于复杂非线性系统的预测问题。文中详细阐述了算法的设计思路、优化机制及在LSTM参数优化中的具体应用,并提供了可复现的Matlab代码,属于SCI级别研究成果的复现与拓展。; 适合人群:具备一定机器学习和优化算法基础,熟悉Matlab编程,从事智能算法、时间序列预测或分类模型研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①提升LSTM在分类任务中的准确性与收敛速度;②研究混合智能优化算法(如GA与PSO结合)在神经网络超参数优化中的应用;③实现高精度分类预测模型,适用于电力系统故障诊断、电池健康状态识别等领域; 阅读建议:建议读者结合Matlab代码逐步调试运行,理解GA-HIDMSPSO算法的实现细节,重点关注种群划分、异构策略设计及与LSTM的集成方式,同时可扩展至其他深度学习模型的参数优化任务中进行对比实验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值