题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1085

迭代加深搜索。

估价函数是为了预计步数来剪枝,所以要优于实际步数。

没错,不是为了确定搜索顺序,而是为了可行性剪枝!这样的话-1的情况就不会很慢了。

  这样的话估价函数也不能弄什么 每个不合法位置到最近合法位置的距离 或者 把这个距离/3当做步数 了呢……

总之估价函数弄成不合法位置的个数来表示预计步数是很好的。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cmath>
  5. #include<algorithm>
  6. using namespace std;
  7. int T,dist[][],kx,ky,lm,ans,pri;
  8. int cz[][]={,,-,-,-,-,,-,,-,,,,,-,,-,};
  9. char a[][];
  10. bool flag;
  11. int g0(int i,int j)
  12. {
  13. if(j<i||(i==&&j==)||(i==&&j==))return ;return ;
  14. }
  15. int g1(int i,int j)
  16. {
  17. if(j>i||(i==&&j==)||(i==&&j==))return ;return ;
  18. }
  19. int gx(int i,int j)
  20. {
  21. if(i==&&j==)return ;return ;
  22. }
  23. int g(int i,int j)
  24. {
  25. if(a[i][j]=='')return g0(i,j);if(a[i][j]=='')return g1(i,j);return gx(i,j);
  26. }
  27. void init()
  28. {
  29. pri=;//
  30. for(int i=;i<=;i++)
  31. for(int j=;j<=;j++)
  32. {
  33. pri+=g(i,j);if(a[i][j]=='*')kx=i,ky=j;
  34. }
  35. }
  36. bool pd(int x,int y,int k)
  37. {
  38. if(x+cz[k][]<=&&x+cz[k][]>=&&y+cz[k][]<=&&y+cz[k][]>=)return true;
  39. return false;
  40. }
  41. void dfs(int x,int y,int cnt,int base)
  42. {
  43. if(cnt==lm&&!base){flag=;ans=cnt;return;}
  44. if(cnt>=lm)return;
  45. for(int i=;i<=;i++) if(pd(x,y,i))
  46. {
  47. int tx=x+cz[i][],ty=y+cz[i][],val;
  48. if(a[tx][ty]=='')val=base-g0(tx,ty)-gx(x,y)+g0(x,y)+gx(tx,ty);
  49. else val=base-g1(tx,ty)-gx(x,y)+g1(x,y)+gx(tx,ty);
  50. if(val+cnt<=lm)
  51. {
  52. a[x][y]=a[tx][ty];a[tx][ty]='*';
  53. dfs(tx,ty,cnt+,val);
  54. a[tx][ty]=a[x][y];a[x][y]='*';
  55. if(flag)return;
  56. }
  57. }
  58. }
  59. int main()
  60. {
  61. scanf("%d",&T);
  62. while(T--)
  63. {
  64. for(int i=;i<=;i++)scanf("%s",a[i]+);
  65. init();flag=;
  66. for(lm=;lm<=;lm++)
  67. {
  68. dfs(kx,ky,,pri);if(flag)break;
  69. }
  70. if(flag)printf("%d\n",ans);else printf("-1\n");
  71. }
  72. return ;
  73. }

bzoj 1085 [SCOI2005]骑士精神——IDA*的更多相关文章

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

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

  2. bzoj 1085: [SCOI2005]骑士精神 IDA*

    题目链接 给一个图, 目标位置是确定的, 问你能否在15步之内达到目标位置. 因为只有15步, 所以直接ida* #include<bits/stdc++.h> using namespa ...

  3. Bzoj 1085: [SCOI2005]骑士精神 (dfs)

    Bzoj 1085: [SCOI2005]骑士精神 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1085 dfs + 剪枝. 剪枝方法: ...

  4. BZOJ 1085: [SCOI2005]骑士精神( IDDFS + A* )

    一开始写了个 BFS 然后就 T 了... 这道题是迭代加深搜索 + A* -------------------------------------------------------------- ...

  5. BZOJ 1085 [SCOI2005]骑士精神 【A*启发式搜索】

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

  6. bzoj 1085: [SCOI2005]骑士精神

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

  7. [BZOJ 1085][SCOI2005]骑士精神(IDA*)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1085 分析: 首先第一感觉是宽搜,但是空间需要8^15*5*5,明显不够,又鉴于最大深 ...

  8. BZOJ.1085.[SCOI2005]骑士精神(迭代加深搜索)

    题目链接 最小步数这类,适合用迭代加深搜索. 用空格走代替骑士. 搜索时记录上一步防止来回走. 不需要每次判断是否都在位置,可以计算出不在对应位置的骑士有多少个.而且每次复原一个骑士至少需要一步. 空 ...

  9. BZOJ 1085: [SCOI2005]骑士精神(A*算法)

    第一次写A*算法(这就是A*?如果这就是A*的话,那不就只是搜索的一个优化了= =,不过h函数如果弄难一点真的有些难设计) 其实就是判断t+h(x)(t为当前步数,h(x)为达到当前状态的最小步数) ...

随机推荐

  1. Linux系统下wget命令的使用教程

    一.Linux wget简介 wget是linux上的命令行的下载工具.这是一个GPL许可证下的自由软件.Linux wget支持HTTP和FTP协议,支持代理服务器和断点续传功能,能够自动递归远程主 ...

  2. canal入门使用

    1.下载canal安装包: 地址:https://github.com/alibaba/canal/releases 图例: 2.将下载好的安装包复制到Linux,解压 3.修改配置文件 vi con ...

  3. vim与shell终端操作技巧

    一.快速注释多行代码 1.添加//注释符 :10,50s#^#//#g       使用#作为分隔符 2.删除//注释符 :10,50s#^//##g       使用#作为分隔符 3.添加#注释符 ...

  4. mapreduce&GFS&bigtable learning

    之前在学习udf的时候接触到了mapreduce,感觉很酷,于是学习了一下,看了mapreduce和GFS的论文,但是没有总结,只是看了一遍 准备利用在学校的时间,学习一下bigtable,然后再认真 ...

  5. js插件封装

    插件封装原则 1.暴露出来的实例必须只能是一个 2.IIFE包裹 !执行包裹 函数作用域保护 3.实例化方法不要写在函数内 throw这个方法是报错

  6. 图示:DOM元素各种位置属性

  7. activity启动模式之singleInstance

    activity启动模式之singleInstance 一.简介 Log.d("C2", getTaskId()+"");里面的getTaskId()可以获取a ...

  8. Python 乘法口诀表

    环境 Anaconda3 Python 3.6, Window 64bit 目的 输出9*9 乘法口诀表 代码 # -*- coding: utf-8 -*- ''' 1*1=1 2*1=2 2*2= ...

  9. Spring mvc使用不了jstl 或者 Spring mvc不解析jstl

    最近我搭了一个maven的springMVC的项目发现前端怎么也识别不了我的jstl,我查询了很多方法,导致这种情况的原因有很多 1.jar引用不对,maven中的正确导入可用的jar <dep ...

  10. sizeof结构体

    规则1:结构体的对折长度为其基本数据成员的长度的最大值. 规则2:指定边界情况下,结构体的对折长度为自身对折长度和指定对折长度中较小者. 规则3:当行内结构体的基本数据成员的起始地址必须为其长度的整数 ...