• 【日常学习】【IDA*】codevs2449 骑士精神题解


    题目描写叙述 Description

         在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位。在不论什么时候一个骑士都能依照骑士的走法(它能够走到和它横坐标相差为1。纵坐标相差为2或者横坐标相差为2。纵坐标相差为1的格子)移动到空位上。

            给定一个初始的棋盘,如何才干经过移动变成例如以下目标棋盘:

                             

    为了体现出骑士精神。他们必须以最少的步数完毕任务。

    输入描写叙述 Input Description

    第一行有一个正整数T(T<=10)。表示一共同拥有N组数据。接下来有T个5×5的矩阵,0表示白色骑士。1表示黑色骑士。*表示空位。

    两组数据之间没有空行。

    输出描写叙述 Output Description

    对于每组数据都输出一行。

    假设能在15步以内(包含15步)到达目标状态,则输出步数。否则输出-1。

    例子输入 Sample Input
    2
    10110
    01*11
    10111
    01001
    00000
    01011
    110*1
    01110
    01010
    00100
    例子输出 Sample Output

    7

    -1

    图片不在这儿= =只是看代码就知道了

    这是我第一次写IDA* 还是參考了黄学长代码 顺便被罗雨屏神犇好好的歧视了一下 一開始仅仅写了迭代加深搜索 仅仅过了两个点 加了启示式搜索之后过了 事实上这里的估价函数就是里奥神犇当时DFS的剪枝 所以里奥神犇当时写的就已经是IDA*了 ORZ里奥神犇

    所谓启示式搜索,就是在搜索过程中加入一个估价函数,代表当前状态到目标状态预估所须要的步数。剪枝就是将不合法的情况去掉。但也能够不剪,优先向估价函数小的方向搜索,在这个方向我们得到正确解期望较大,能够节省时间。

    应当注意的是,估价函数仅仅是一个估价。并非实际步数。

    假设剪掉估价函数较大的情况,相当于是放弃了一些可能是答案的情况。

    但这些情况是答案的可能性较小。

    直接上代码吧,关于二维数组的传递。我还不是非常明确。希望大家看了代码帮帮忙


    注意这里。二维数组的传递

    对于函数的调用是这样写的:

    if (ok(&a[0]))
            {
                flag=true;
            }
            return;

    这个函数声明时,是这种:

    bool ok(int (*a)[5])

    当中a是一个二维数组。在函数中应用时,直接写a[x][y]就可以

    这里a数组我们传递的是地址。由于里奥神犇说。假设传数组的话,数组大了非常可能爆栈。

    可是详细为什么要这样写。我也不大明确

    原本对于数组a的指针应当是【**a】,可是假设这样写,以下的引用就会各种报错。最后的解决方式就是上面这种。看来我还要慢慢学习啊。

    假设有哪位同学懂得二维数组用作实參的传递,请务必告诉我。

    ——闲梦远,南国正清秋。千里江山寒色远,芦花深处泊孤舟。笛在月明楼。




  • 相关阅读:
    局域网文件实时同步工具
    SQLServer备份恢复助手(太强大了!)
    SQLServer 统计查询语句消耗时间
    如何将Sql server数据库中的模型图转化到Word中--并能够查看字段的属性信息
    创建Database Diagrams时遇到的问题
    bat 操作数据库(附加,分离,删除,还原)
    Bat 多个执行操作选择
    Redis Windows下查看版本号
    ThinkPHP 数据库操作(七) : 视图查询、子查询、原生查询
    ThinkPHP 数据库操作(六) : 查询事件、事务操作、监听SQL
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/7195070.html
Copyright © 2020-2023  润新知