【日常学习】【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】,但是如果这样写,下面的引用就会各种报错。最后的解决方案就是上面这样的,看来我还要慢慢学习啊。

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

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

版权声明:转载请注明出处 [ametake版权所有]http://blog.csdn.net/ametake欢迎来看

时间: 2024-11-14 15:12:29

【日常学习】【IDA*】codevs2449 骑士精神题解的相关文章

BZOJ1085:[SCOI2005]骑士精神——题解+IDA*粗略讲解

http://www.lydsy.com/JudgeOnline/problem.php?id=1085 Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑 士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2,纵坐标相差为1的格子)移动到空位上. 给定一个初始的棋盘,怎样才能经过移动变成如下目标棋盘: 为了体现出骑士精神,他们必须以最少的步数完成任务. Input 第一行有一个正整数T(T<=10)

codevs2449 骑士精神

题目描述 Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2,纵坐标相差为1的格子)移动到空位上. 给定一个初始的棋盘,怎样才能经过移动变成如下目标棋盘: 为了体现出骑士精神,他们必须以最少的步数完成任务. 输入描述 Input Description 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,

【日常学习】codevs1287 矩阵乘法题解

转载请注明出处 [ametake版权所有]http://blog.csdn.net/ametake欢迎来看. 先上题目 题目描述 Description 小明最近在为线性代数而头疼,线性代数确实很抽象(也很无聊),可惜他的老师正在讲这矩阵乘法这一段内容. 当然,小明上课打瞌睡也没问题,但线性代数的习题可是很可怕的.小明希望你来帮他完成这个任务. 现在给你一个ai行aj列的矩阵和一个bi行bj列的矩阵,要你求出他们相乘的积(当然也是矩阵). (输入数据保证aj=bi,不需要判断) 矩阵乘法的定义:

埃及分数&amp;&amp;The Rotation Game&amp;&amp;骑士精神——IDA*

IDA*:非常好用的搜索,可以解决很多深度浅,但是规模大的搜索问题. 估价函数设计思路:观察一步最多能向答案靠近多少. 埃及分数 题目大意: 给出一个分数,由分子a 和分母b 构成,现在要你分解成一系列互不相同的单位分数(形如:1/a,即分子为1),要求:分解成的单位分数数量越少越好,如果数量一样,最小的那个单位分数越大越好. 如: 19/45 = 1/3 + 1/12 + 1/180; 19/45 = 1/5 + 1/6 + 1/18; 以上两种分解方法都要3个单位分数,但下面一个的最小单位分

【日常学习】【迭代加深搜索+哈希】codevs1004 四子连棋题解

转载请注明出处 [ametake版权所有]http://blog.csdn.net/ametake 题目描述 Description 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋子,7颗黑色棋子,有两个空白地带,任何一颗黑白棋子都可以向上下左右四个方向移动到相邻的空格,这叫行棋一步,黑白双方交替走棋,任意一方可以先走,如果某个时刻使得任意一种颜色的棋子形成四个一线(包括斜线),这样的状态为目标棋局. ● ○ ●   ○ ● ○ ● ● ○ ● ○ ○ ● ○   输入描述 Input

A*算法详解 BZOJ 1085骑士精神

转载1:A*算法入门 http://www.cppblog.com/mythit/archive/2009/04/19/80492.aspx 在看下面这篇文章之前,先介绍几个理论知识,有助于理解A*算法. 启发式搜索:启发式搜索就是在状态空间中的搜索对每一个搜索的位置进行评估,得到最好的位置,再从这个位置进行搜索直到目标.这样可以省略大量无畏的搜索路径,提到了效率.在启发式搜索中,对位置的估价是十分重要的.采用了不同的估价可以有不同的效果. 估价函数:从当前节点移动到目标节点的预估费用:这个估计

[SCOI2005]骑士精神

题目描述:在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑 士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2,纵坐标相差为1的格子)移动到空 位上. 给定一个初始的棋盘,怎样才能经过移动变成如下目标棋盘: 为了体现出骑士精神,他们必须以最少的步 数完成任务. 题解: IDA* 搜索. 非常友好. 代码: #include<cstdio> #include<cstring> #include<algo

bzoj1085 [SCOI2005]骑士精神

1085: [SCOI2005]骑士精神 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2490  Solved: 1422[Submit][Status][Discuss] Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2,纵坐标相差为1的格子)移动到空位上. 给定一个初始的棋盘,怎样才能经过移动

骑士精神

骑士精神 题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,*表示空位.两组数据之间没有空行. 输出格式: 对于每组数据都输出一行.如果能在15步以内(包括15步)到达目标状态,则输出步数,否则输出-1. 输入输出样例 输入样例: 2 10110 01*11 10111 01001 00000 01011 110*1 01110 01010 00100 输出样例: 7 -1 说明 解析: 经典A*