关于烙饼排序问题的优化

今天偶然在weixingstudio大侠的blog上看到了烙饼排序问题,研究了一下,做了一点小小的改进,原文地址:

http://blog.csdn.net/weixingstudio/article/details/6912434


比如用35142这个串来研究,递归下去,发现有大量的没有用的(或者说冗余的)交换,比如首次递归,会得到这样的结果:
第一层:53142
第二层:35142
第三层:53142
第四层:35142
……
这个重复一直到Search(step+1)导致111行返回为止。
如果某一层的循环陷入这样的死扣,就只有等到上面这句话发生为止才能终止这个递归分支。
实际上,这个情况是可以预防的,如果在每一次迭代时传入上次迭代的i值,并在本次迭代中跳过相同的i值,则可以消去很多没用的分支,将代码修改如下:

……
Search(0, 0) //原代码第21行
……
void Search(int step, int lastI) //原代码第102行
……
for(i=1;i<m_nCakeCnt;i++)  //源代码第129行
{
    if ( i != lastI )
    {
        Reverse(0,i);
        m_ReverseCakeArraySwap[step]=i;
        Search(step+1, i);
        Reverse(0,i);
    }
}

这样修改之后,再运行,解是一样的,但是搜索次数由原来的2189次减少到了716次。
运行结果如下:


--->begin
32423
 |Search Times|:716
Total Swap times=5




已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页