题目链接 : BZOJ 1085

题目分析 :

  本题中可能的状态会有 (2^24) * 25 种状态,需要使用优秀的搜索方式和一些优化技巧。

  我使用的是 IDA* 搜索,从小到大枚举步数,每次 DFS 验证在当前枚举的步数之内能否到达目标状态。

  如果不能到达,就枚举下一个步数,重新搜索,即使某些状态在之前的 DFS 中已经搜索过,我们仍然搜索。

  并且在一次 DFS 中,我们不需要判定重复的状态。

  在 IDA* 中,重要的剪枝优化是 估价函数 ,将一些不可能存在可行解的枝条剪掉。

  如果估价函数写得高效,就能有极好的效果。我们写估价函数的原则是,绝对不能剪掉可能存在可行解的枝条。

  因此,在预估需要步数时,应让估计值尽量接近实际步数,但一定不能大于实际需要的步数。

  本题的一个很有效的估价函数是,比较当前状态的黑白骑士与目标状态的黑白骑士有多少不同,我们把这个值作为估价函数值,因为每一步最多将当前状态的一个骑士改变为与目标状态相同。但是应该注意的是,空格所在的格子不要算入其中。

代码如下:

  

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cstring>
  5. #include <cmath>
  6. #include <algorithm>
  7.  
  8. using namespace std;
  9.  
  10. const int MaxStep = ;
  11. const int Dx[] = {, , -, -, , , -, -}, Dy[] = {, -, , -, , -, , -};
  12.  
  13. int Te, Ans;
  14.  
  15. char Str[];
  16.  
  17. struct ES
  18. {
  19.     int num, pos;
  20.     bool operator == (const ES &e) const {
  21.         return (num == e.num) && (pos == e.pos);
  22.     }
  23. } S, T;
  24.  
  25. inline bool Inside(int x, int y) {
  26.     if (x < || x > ) return false;
  27.     if (y < || y > ) return false;
  28.     return true;
  29. }
  30.  
  31. void Print(ES x) {
  32.     for (int i = ; i < ; ++i) {
  33.         for (int j = ; j < ; ++j) {
  34.             if (x.pos == (i * + j)) printf("*");
  35.             else {
  36.                 if (x.num & ( << (i * + j))) printf("");
  37.                 else printf("");
  38.             }
  39.         }
  40.         printf("\n");
  41.     }
  42. }
  43.  
  44. inline int Expect(ES x) {
  45.     int Temp, Cnt;
  46.     Temp = x.num ^ T.num;
  47.     Cnt = ;
  48.     if (x.pos != T.pos) {
  49.         if (Temp & ( << T.pos)) --Cnt;
  50.         if (Temp & ( << x.pos)) --Cnt;
  51.     }
  52.     while (Temp) {
  53.         ++Cnt;
  54.         Temp -= Temp & -Temp;
  55.     }
  56.     return Cnt;
  57. }
  58.  
  59. bool DFS(ES Now, int Step, int Limit) {
  60.     if (Now == T) return true;
  61.     if (Step == Limit) return false;
  62.     if (Expect(Now) > Limit - Step) return false;
  63.     int x, y, xx, yy;
  64.     ES Next;
  65.     x = Now.pos / ; y = Now.pos % ;
  66.     for (int i = ; i < ; i++) {
  67.         xx = x + Dx[i]; yy = y + Dy[i];
  68.         if (!Inside(xx, yy)) continue;
  69.         Next = Now;
  70.         Next.pos = xx * + yy;
  71.         Next.num &= ( << ) - - ( << (xx * + yy));
  72.         if (Now.num & ( << (xx * + yy))) Next.num |= ( << (x * + y));
  73.         if (DFS(Next, Step + , Limit)) return true;
  74.     }
  75.     return false;
  76. }
  77.  
  78. int IDAStar(ES S) {
  79.     if (S == T) return ;
  80.     for (int i = ; i <= MaxStep; ++i)
  81.         if (DFS(S, , i)) return i;
  82.     return -;
  83. }
  84.  
  85. int main()
  86. {
  87.     scanf("%d", &Te);
  88.     T.num = ; T.pos = ;
  89.     for (int Case = ; Case <= Te; ++Case) {
  90.         S.num = ;
  91.         for (int i = ; i < ; ++i) {
  92.             scanf("%s", Str);
  93.             for (int j = ; j < ; ++j) {
  94.                 if (Str[j] == '') S.num |= ( << (i * + j));
  95.                 if (Str[j] == '*') S.pos = i * + j;
  96.             }
  97.         }
  98.         Ans = IDAStar(S);
  99.         printf("%d\n", Ans);
  100.     }
  101.     return ;
  102. }

  

[BZOJ 1085] [SCOI2005] 骑士精神 [ IDA* 搜索 ]的更多相关文章

  1. bzoj 1085 [SCOI2005]骑士精神——IDA*

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1085 迭代加深搜索. 估价函数是为了预计步数来剪枝,所以要优于实际步数. 没错,不是为了确定 ...

  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. OC的单例模式的实现

    下面是在ARC,GCD下的单例模式实现: 头文件里申明类方法getInstance: #import <Foundation/Foundation.h> @interface Single ...

  2. Raspberry Pi + 3个USB摄像头 + Motion(简易监控设备配置记录1——介绍以及安装) 分类: Raspberry Pi 服务器搭建 2015-04-12 19:21 226人阅读 评论(0) 收藏

    参考: Debian官网链接 Motion官网链接 首先,参见Debian官网链接对Motion的介绍,网页中包含了所有相关依赖包,请首先确保这些依赖包的安装. Motion介绍 摘出对Motion的 ...

  3. [RxJS] Transformation operator: buffer, bufferCount, bufferTime

    This lesson will teach you about another horizontal combination operator: buffer and its variants. B ...

  4. RxJava使用场景小结

    一.Scheduler线程切换 这种场景经常会在“后台线程取数据,主线程展示”的模式中看见 Observable.just(1, 2, 3, 4) .subscribeOn(Schedulers.io ...

  5. iOS UIKit:Auto Layout

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css); @import url(/ ...

  6. $HTTP_RAW_POST_DATA

    这是手册里写的 总是产生变量包含有原始的 POST 数据.否则,此变量仅在碰到未识别 MIME 类型的数据时产生.不过,访问原始 POST 数据的更好方法是 php://input.$HTTP_RAW ...

  7. VB中右键换行

    /r/n  能在邮件中进行换行, 在VB中使用 ASCII码的 chr(10).chr(13) 就能使VB发送邮件实现换行

  8. java对象与xml相互转换 ---- xstream

    XStream是一个Java对象和XML相互转换的工具,很好很强大.提供了所有的基础类型.数组.集合等类型直接转换的支持. XStream中的核心类就是XStream类,一般来说,熟悉这个类基本就够用 ...

  9. sql查看数据库表使用情况

    如有更好的方式,希望交流. 感谢热心人,cc谢过  EXEC sys.sp_MSforeachtable         @precommand = N'create table ##( 表名 sys ...

  10. Dictionary的遍历和修改

    /// <summary>        /// 初始化一个Dic        /// </summary>        public static void mainTe ...