_15-骑士精神(IDA*)
一道经典的IDA*入门题,本质上就是dfs+估价函数
思路:以唯一的空位为起点,进行dfs,利用估价函数进行剪枝。
for(int dep=1;maxdep<=15;dep++){ //dep:本次需要移动的次数,因为从1开始,一但满足条件,就是题目所要求的最小步数A_star(0,stx,sty,dep); //dfs代码,stx sty:空位所在位子if(success){ //如果满足条件,输出步数printf("%d\n",dep);}}
评估函数:
评估函数是理想的情况,而实际情况一定会大于等于评估函数,但如果评估函数越接近实际情况,那么剪枝效果就越好。
int evaluate(){int cnt=0;for(int i=0;i<5;i++)for(int j=0;j<5;j++)if(mp[i][j]!=goal[i][j])cnt++; //如果现棋盘与目标棋盘不符,则cnt(至少需要的步数)加1return cnt;
}
dfs:
void a_star(int dep,int x,int y,int maxdep) {if (dep==maxdep){ //返回条件是当前搜索数达到了最大搜索数(也就是一开始传进来的dep)if(evaluate() == 0) //如果评估函数为0,说明现棋盘与目标棋盘一致success = 1;return;}int mx[8] = { -2,-2,-1,1,-1,1,2,2 }; //棋子走的八个方向int my[8] = { -1,1,2, 2,-2,-2,-1,1 };for (int i = 0; i < 8; i++) {int xx = x + mx[i];int yy = y + my[i];if (!check(xx, yy)) //check()判断移动后的棋子是否越界continue;swap(a[x][y], a[xx][yy]); //交换两棋子if (evaluate() + dep <= maxdep) //如果评估函数的步数加当前步数未达到限制步数,进行迭代加深,这一步达到剪枝效果a_star(dep + 1, xx, yy, maxdep); //迭代加深swap( a[x][y],a[xx][yy]); //记得要回溯回来}
}
总代码:
#include<iostream>
using namespace std;
int goal[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} };//1黑,0白
int x, y,m,n,success,a[5][5],flag;
int mx[8] = { -2,-2,-1,1,-1,1,2,2 };
int my[8] = { -1,1,2, 2,-2,-2,-1,1 };
int evaluate() { //价值评估int cnt = 0;for (int i = 0; i < 5; i++) {for (int j = 0; j < 5; j++) {if (a[i][j] != goal[i][j])cnt++;}}return cnt;
}
bool check(int x, int y) { //判断棋子有无越界if(x<0||x>4||y<0||y>4)return false;return true;
}
void a_star(int dep,int x,int y,int maxdep) {if (dep==maxdep){if(evaluate() == 0) success = 1;return;}for (int i = 0; i < 8; i++) {int xx = x + mx[i];int yy = y + my[i];if (!check(xx, yy))continue;swap(a[x][y], a[xx][yy]);if (evaluate() + dep <= maxdep) a_star(dep + 1, xx, yy, maxdep);swap( a[x][y],a[xx][yy]);}
}
int main() {char c;int t;cin >> t;while (t) {success = 0;flag = 0;for (int i = 0; i < 5; i++) {for (int j = 0; j < 5; j++) {cin >> c;if (c != '*')a[i][j] = c - '0';else {a[i][j] = 2;n = i;m = j;}}}if (evaluate() == 0) {cout << 0 << endl;continue;}for (int i = 1; i <= 10; i++) {a_star(0, n, m, i);if (success == 1) {cout << i << endl;flag = 1;break;}}if (flag == 0)cout << -1 << endl;t--;}return 0;
}
ps:今天看这题,才认识了A*,尽管这是一道入门题,但自己还是花了一晚上搞定,要多练习。
_15-骑士精神(IDA*)相关推荐
- 『骑士精神 IDA*』
骑士精神(SCOI2005) Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑 士的走法(它可以走到和它横坐标相差为1,纵 ...
- 埃及分数The Rotation Game骑士精神——IDA*
IDA*:非常好用的搜索,可以解决很多深度浅,但是规模大的搜索问题. 估价函数设计思路:观察一步最多能向答案靠近多少. 埃及分数 题目大意: 给出一个分数,由分子a 和分母b 构成,现在要你分解成一系 ...
- [BZOJ 1085] [SCOI2005] 骑士精神 [ IDA* 搜索 ]
题目链接 : BZOJ 1085 题目分析 : 本题中可能的状态会有 (2^24) * 25 种状态,需要使用优秀的搜索方式和一些优化技巧. 我使用的是 IDA* 搜索,从小到大枚举步数,每次 DFS ...
- P2324 [SCOI2005]骑士精神(IDA*)
思路:不是动骑士,而是动空格.只能动15次,证明搜索树的高的确定的,考虑IDA解决 IDA能很好地解决一些搜索中有上界的情况 大概就是搞一个估值函数,然后当前情况+估价函数>限制的情况直接剪掉这 ...
- luoguP2324 [SCOI2005]骑士精神 IDA*
题面 这个题比较简单 直接枚举搜索深度 估价函数为当前棋盘与目标棋盘不同的棋的个数 然后直接迭代加深搜索就可以了 当然还不能走回头路 Codes #include<bits/stdc++.h&g ...
- bzoj 1085: [SCOI2005]骑士精神(IDA*)
1085: [SCOI2005]骑士精神 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2296 Solved: 1328 [Submit][St ...
- 洛谷 P2324 [SCOI2005]骑士精神 解题报告
P2324 [SCOI2005]骑士精神 题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,* ...
- [SCOI2005][BZOJ1085] 骑士精神
1085: [SCOI2005]骑士精神 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 1112 Solved: 604 [Submit][Sta ...
- 【SCOI 2005】骑士精神
[题目] 传送门 题目描述: 在一个 5×55×55×5 的棋盘上有 121212 个白色的骑士和 121212 个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐 ...
- 骑士精神(双向深搜+meet in the middle)
题目描述 在一个5×55×55×5的棋盘上有121212个白色的骑士和121212个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为111,纵坐标相差为22 ...
最新文章
- Facebook面部识别新突破:可识别未标记照片中用户
- Python - 关于方法参数和字典更新(dict.update())方法
- dataframe 众数的方法_数据分析师最常用的数据分析方法。你都掌握了吗?
- 软件是否有必要进行性能测试
- 解决文件路径的问题的总结
- 《Java EE 7精粹》—— 第3章 JSF 3.1 Facelets
- 基于百度贴吧的HIV高危人群特征分析
- c++ STL平常练习-3
- 视频编码格式 封装格式
- AI 四小龙之间没有战争
- Python - 面向对象编程 - 类变量、实例变量/类属性、实例属性
- 2019JAVA面试题附答案-精心整理-很全面面试大大节省时间
- 工作日报这样写 大老板也挑不出错
- 三角网格剖分工具 Triangle 安装及使用
- 照片加水印怎么弄?方法详细介绍
- 项目:家庭收入支出记账软件(JAVA语言)
- 联想服务器怎么用u盘安装系统安装win7系统教程,联想一体机如何安装win7_联想一体机怎么使用u盘重装win7...
- GRAFANA接入第三方SSO
- CE寻找游戏基址+偏移
- rj45水晶头网线的做法
热门文章
- Linux 配置Git
- 红米4高配版_标注:2016060_官方线刷包_救砖包_解账户锁
- Python Socket 编程详细介绍
- css 外弧_CSS绘制圆(弧)
- openbmc开发16:配置文件详细介绍
- Ubuntu系统安装英伟达显卡
- 面向未来的智能驾驶关键设计要素:融合定位
- Thingsboard之魔鬼编译,编译失败问题整理,ServerUI
- Matlab实现——严格对角占优三对角方程组求解(高斯赛尔德Gauss-Seidel迭代、超松弛)
- 2021年度总结,一整年的精华所在!