bzoj 1085: [SCOI2005]骑士精神(IDA*)
1085: [SCOI2005]骑士精神
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 2296 Solved: 1328
[Submit][Status][Discuss]
Description
在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位。在任何时候一个骑士都能按照骑
士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2,纵坐标相差为1的格子)移动到空
位上。 给定一个初始的棋盘,怎样才能经过移动变成如下目标棋盘: 为了体现出骑士精神,他们必须以最少的步
数完成任务。
Input
第一行有一个正整数T(T<=10),表示一共有N组数据。接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,*表示空位。两组数据之间没有空行。
Output
对于每组数据都输出一行。如果能在15步以内(包括15步)到达目标状态,则输出步数,否则输出-1。
Sample Input
Sample Output
IDA*的基本思路:
首先将初始状态结点的H值设为阈值maxH,然后进行深度优先搜索,搜索过程中忽略所有H值大于maxH的结点;
如果没有找到解,则加大阈值maxH,再重复上述搜索,直到找到一个解,
在保证H值的计算满足A*算法的要求下,可以证明找到的这个解一定是最优解
IDA*的优点:
在程序实现上,IDA*要比A*方便,因为不需要保存结点,不需要判重复,
也不需要根据H值对结点排序,占用空间小。
而在IDA*算法中也要使用合适的估价函数,来评估与目标状态的距离。
估价函数一般选择:
当前局面的估价函数值+当前的搜索深度>预定义的最大搜索深度时,就进行剪枝。
对于这题,因为限制了步数在15步之内,初始直接将阈值设为0,然后慢慢加到15,也就说先假设0步就能完成,
如果搜不出来,就假设它1步能完成……以此类推直到能完成为止
搜索过程中如果当前局面已经无法在要求步数之内完成了,就直接剪枝
#include<stdio.h>
#include<algorithm>
using namespace std;
int Aim[5][5] = {1,1,1,1,1,0,1,1,1,1,0,0,2,1,1,0,0,0,0,1,0,0,0,0,0};
int dir[8][2] = {-2,1,-1,2,1,2,2,1,2,-1,1,-2,-1,-2,-2,-1};
int ok, a[5][5];
int check()
{int i, j, sum;sum = 0;for(i=0;i<5;i++){for(j=0;j<5;j++){if(Aim[i][j]!=a[i][j])sum++;}}return sum;
}
void Sech(int x, int y, int k)
{int i, dx, dy;if(k==0){if(check()==0)ok = 1;return;}if(ok) return;for(i=0;i<=7;i++){dx = x+dir[i][0];dy = y+dir[i][1];if(dx<0 || dx>4 || dy<0 || dy>4)continue;swap(a[x][y], a[dx][dy]);if(check()<=k)Sech(dx, dy, k-1);swap(a[x][y], a[dx][dy]);}
}
int main(void)
{char ch;int T, i, j, x, y;scanf("%d", &T);while(T--){ok = 0;for(i=0;i<5;i++){for(j=0;j<5;j++){scanf(" %c", &ch);if(ch=='0') a[i][j] = 0;else if(ch=='1') a[i][j] = 1;else a[i][j] = 2, x = i, y = j;}}for(i=0;i<=15;i++){Sech(x, y, i);if(ok) break;}if(ok) printf("%d\n", i);else printf("-1\n");}return 0;
}
bzoj 1085: [SCOI2005]骑士精神(IDA*)相关推荐
- [BZOJ 1085] [SCOI2005] 骑士精神 [ IDA* 搜索 ]
题目链接 : BZOJ 1085 题目分析 : 本题中可能的状态会有 (2^24) * 25 种状态,需要使用优秀的搜索方式和一些优化技巧. 我使用的是 IDA* 搜索,从小到大枚举步数,每次 DFS ...
- BZOJ 1085 [SCOI2005]骑士精神 【A*启发式搜索】
1085: [SCOI2005]骑士精神 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2838 Solved: 1663 [Submit][St ...
- 1085: [SCOI2005]骑士精神
Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑 士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2 ...
- P2324 [SCOI2005]骑士精神(IDA*)
思路:不是动骑士,而是动空格.只能动15次,证明搜索树的高的确定的,考虑IDA解决 IDA能很好地解决一些搜索中有上界的情况 大概就是搞一个估值函数,然后当前情况+估价函数>限制的情况直接剪掉这 ...
- luoguP2324 [SCOI2005]骑士精神 IDA*
题面 这个题比较简单 直接枚举搜索深度 估价函数为当前棋盘与目标棋盘不同的棋的个数 然后直接迭代加深搜索就可以了 当然还不能走回头路 Codes #include<bits/stdc++.h&g ...
- bzoj1085: [SCOI2005]骑士精神(a*)
1085: [SCOI2005]骑士精神 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2555 Solved: 1472 [Submit][St ...
- 洛谷 P2324 [SCOI2005]骑士精神 解题报告
P2324 [SCOI2005]骑士精神 题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,* ...
- 『骑士精神 IDA*』
骑士精神(SCOI2005) Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑 士的走法(它可以走到和它横坐标相差为1,纵 ...
- BZOJ1085 [SCOI2005] 骑士精神
[问题描述] 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑 士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2,纵坐标相 ...
最新文章
- mysql表一定要主键吗_最滋补五脏的食物表,一定要给家人存下
- INotifyPropertyChanged 接口 CallerMemberName属性
- 当查找名字的时候通过外围作用域向外查找(如何理解)
- 【渝粤教育】国家开放大学2018年春季 0089-22TInternet和Intranet应用 参考试题
- SP2010开发和VS2010专家食谱--第二章节--工作流
- Qt场景中图形项的删除
- 说说过游戏保护(4)
- jQuery插件:Tiny Scrollbar滚动条插件(滚动条美化、默认滚动条)
- oracle账户用root权限执行sh,安装Oracle执行orainstRoot.sh与root.sh作用
- SSH 命令常见用法
- 骨架屏 (Skeleton Screen)
- Express中间件(非常详细)
- electron sqlite3_Electron+React+Antd工程搭建
- 译:理解 Win32 OutputDebugString
- 深入浅出SCSI子系统(八)SCSI错误恢复
- [数据挖掘笔记01] 关联规则Apriori算法
- 高德地图通过经纬度定位并打上标记
- 睁开双眼玩立体游戏 3D显示技术解析
- Miniconda3环境搭建详细流程
- python 交易量化模型_Python期货股票量化交易,多品种组合模型之动量策略!
热门文章
- 为什么都建议学java而不是python-现在学Python还是Java好呢?
- 小白用python处理excel文件-python处理excel文件
- mysql中Group_concat,查找列名,将字符串转换为数字比较大小等杂项记录
- vue打包后图片未显示问题
- vue 绑定背景图片、图片
- vue3.0和vue2的区别
- redhat linux 7 ntp,技术|RHCE 系列(十):在 RHEL/CentOS 7 中设置 NTP(网络时间协议)服务器...
- 流程图讲解_流程图小作文练习,详细讲解+精选范文!你们的魔鬼来了(一)...
- java 模拟 cmd_用JAVA模拟实现CMD命令行
- C# 正则匹配 电话号码 和 座机号