一道经典的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*)相关推荐

  1. 『骑士精神 IDA*』

    骑士精神(SCOI2005) Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑 士的走法(它可以走到和它横坐标相差为1,纵 ...

  2. 埃及分数The Rotation Game骑士精神——IDA*

    IDA*:非常好用的搜索,可以解决很多深度浅,但是规模大的搜索问题. 估价函数设计思路:观察一步最多能向答案靠近多少. 埃及分数 题目大意: 给出一个分数,由分子a 和分母b 构成,现在要你分解成一系 ...

  3. [BZOJ 1085] [SCOI2005] 骑士精神 [ IDA* 搜索 ]

    题目链接 : BZOJ 1085 题目分析 : 本题中可能的状态会有 (2^24) * 25 种状态,需要使用优秀的搜索方式和一些优化技巧. 我使用的是 IDA* 搜索,从小到大枚举步数,每次 DFS ...

  4. P2324 [SCOI2005]骑士精神(IDA*)

    思路:不是动骑士,而是动空格.只能动15次,证明搜索树的高的确定的,考虑IDA解决 IDA能很好地解决一些搜索中有上界的情况 大概就是搞一个估值函数,然后当前情况+估价函数>限制的情况直接剪掉这 ...

  5. luoguP2324 [SCOI2005]骑士精神 IDA*

    题面 这个题比较简单 直接枚举搜索深度 估价函数为当前棋盘与目标棋盘不同的棋的个数 然后直接迭代加深搜索就可以了 当然还不能走回头路 Codes #include<bits/stdc++.h&g ...

  6. bzoj 1085: [SCOI2005]骑士精神(IDA*)

    1085: [SCOI2005]骑士精神 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2296  Solved: 1328 [Submit][St ...

  7. 洛谷 P2324 [SCOI2005]骑士精神 解题报告

    P2324 [SCOI2005]骑士精神 题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,* ...

  8. [SCOI2005][BZOJ1085] 骑士精神

    1085: [SCOI2005]骑士精神 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 1112  Solved: 604 [Submit][Sta ...

  9. 【SCOI 2005】骑士精神

    [题目] 传送门 题目描述: 在一个 5×55×55×5 的棋盘上有 121212 个白色的骑士和 121212 个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐 ...

  10. 骑士精神(双向深搜+meet in the middle)

    题目描述 在一个5×55×55×5的棋盘上有121212个白色的骑士和121212个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为111,纵坐标相差为22 ...

最新文章

  1. Facebook面部识别新突破:可识别未标记照片中用户
  2. Python - 关于方法参数和字典更新(dict.update())方法
  3. dataframe 众数的方法_数据分析师最常用的数据分析方法。你都掌握了吗?
  4. 软件是否有必要进行性能测试
  5. 解决文件路径的问题的总结
  6. 《Java EE 7精粹》—— 第3章 JSF 3.1 Facelets
  7. 基于百度贴吧的HIV高危人群特征分析
  8. c++ STL平常练习-3
  9. 视频编码格式 封装格式
  10. AI 四小龙之间没有战争
  11. Python - 面向对象编程 - 类变量、实例变量/类属性、实例属性
  12. 2019JAVA面试题附答案-精心整理-很全面面试大大节省时间
  13. 工作日报这样写 大老板也挑不出错
  14. 三角网格剖分工具 Triangle 安装及使用
  15. 照片加水印怎么弄?方法详细介绍
  16. 项目:家庭收入支出记账软件(JAVA语言)
  17. 联想服务器怎么用u盘安装系统安装win7系统教程,联想一体机如何安装win7_联想一体机怎么使用u盘重装win7...
  18. GRAFANA接入第三方SSO
  19. CE寻找游戏基址+偏移
  20. rj45水晶头网线的做法

热门文章

  1. Linux 配置Git
  2. 红米4高配版_标注:2016060_官方线刷包_救砖包_解账户锁
  3. Python Socket 编程详细介绍
  4. css 外弧_CSS绘制圆(弧)
  5. openbmc开发16:配置文件详细介绍
  6. Ubuntu系统安装英伟达显卡
  7. 面向未来的智能驾驶关键设计要素:融合定位
  8. Thingsboard之魔鬼编译,编译失败问题整理,ServerUI
  9. Matlab实现——严格对角占优三对角方程组求解(高斯赛尔德Gauss-Seidel迭代、超松弛)
  10. 2021年度总结,一整年的精华所在!