【简单搜索04】Booksort

题目来源:


题目大意:

给出n本排成一列的书的编号1~n(非顺序),通过移动一摞书插入其他书中间最终实现将书按编号排序,求最小移动次数。


解题思路:

迭代加深搜索。

自己写怎么都不对orz跑去看了n个大佬的思路总算有个看懂的orz试着改过直接修改maxd的值而不是通过函数返回的形式但样例二和三老是死循环orzzz,有时间再看了改一下吧。


AC代码:

#include 
#include 
#include 
#define N 20
int n, maxd;
int book[N];
bool flag;

int cut()    //如果把一段编号顺序连续的部分算作一个block, 计算这些block之间有多少空
{
    int r = 0;
    if (book[0]!=1)
    {
        r++;
    }
    if (book[n-1]!=n)
    {
        r++;
    }
    for (int i=1;imaxd)    //每次移动block后,最多可以消除3个空,
    {                                //ceil(cut()/3.0为剩下的理想最小移动次数,通过它来剪枝
        return d+ceil(cut()/3.0);
    }
    if (check())
    {
        flag = true;
        return d;
    }
    int nextd = 100000;
    int i, j, k, l, temp[N];
    for (i=0;i=i;st--,e--)
                {
                    book[e] = book[st];
                }
                for (st=i,e=k+1;e<=j;st++,e++)
                {
                    book[st] = tempp[e];
                }
                int newd = dfs(d+1);
                if (flag)
                {
                    return newd;
                }
                nextd = nextd

你可能感兴趣的:(简单搜索)