题目链接:

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

题目大意:

在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位。在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2,纵坐标相差为1的格子)移动到空位上。 给定一个初始的棋盘,怎样才能经过移动变成如下目标棋盘: 为了体现出骑士精神,他们必须以最少的步数完成任务。

思路:

迭代加深搜索+A*剪枝即可。

每次枚举上限搜索,可以防止dfs每次都要搜到15的深度。

 1 #include<bits/stdc++.h>
 2 #define IOS ios::sync_with_stdio(false);//不可再使用scanf printf
 3 #define Max(a, b) ((a) > (b) ? (a) : (b))//禁用于函数,会超时
 4 #define Min(a, b) ((a) < (b) ? (a) : (b))
 5 #define Mem(a) memset(a, 0, sizeof(a))
 6 #define Dis(x, y, x1, y1) ((x - x1) * (x - x1) + (y - y1) * (y - y1))
 7 #define MID(l, r) ((l) + ((r) - (l)) / 2)
 8 #define lson ((o)<<1)
 9 #define rson ((o)<<1|1)
10 #define Accepted 0
11 #pragma comment(linker, "/STACK:102400000,102400000")//栈外挂
12 using namespace std;
13 inline int read()
14 {
15     int x=0,f=1;char ch=getchar();
16     while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
17     while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
18     return x*f;
19 }
20 typedef long long ll;
21 const int maxn = 2000 + 10;
22 const int MOD = 1000000007;//const引用更快,宏定义也更快
23 const int INF = 1e9 + 7;
24 const double eps = 1e-6;
25
26 int ans[5][5] =
27 {
28     1,1,1,1,1,
29     0,1,1,1,1,
30     0,0,2,1,1,
31     0,0,0,0,1,
32     0,0,0,0,0
33 };
34 int dir[8][2] = {1,2,1,-2,-1,2,-1,-2,2,1,2,-1,-2,1,-2,-1};
35 int flag, k;
36 bool judge(int a[5][5])
37 {
38     for(int i = 0; i < 5; i++)for(int j = 0; j < 5; j++)
39         if(a[i][j] != ans[i][j])return false;
40     return true;
41 }
42 int eva(int a[5][5])//至少还需要走的步数
43 {
44     int tmp = 0;
45     for(int i = 0; i < 5; i++)for(int j = 0; j < 5; j++)
46         if(a[i][j] != ans[i][j])tmp++;
47     return tmp;
48 }
49 void Search(int d, int a[5][5], int x, int y)
50 {
51     if(d == k){flag = judge(a); return;}
52     if(flag)return;
53     for(int i = 0; i < 8; i++)
54     {
55         int xx = x + dir[i][0];
56         int yy = y + dir[i][1];
57         if(xx < 0 || xx > 4 || yy < 0 || yy > 4)continue;
58         swap(a[x][y], a[xx][yy]);
59         if(eva(a) + d <= k)Search(d + 1, a, xx, yy);
60         swap(a[x][y], a[xx][yy]);
61     }
62 }
63 int main()
64 {
65     int T;
66     scanf("%d", &T);
67     while(T--)
68     {
69         char Map[10];
70         int a[5][5];
71         int x, y;
72         flag = 0;
73         for(int i = 0; i < 5; i++)
74         {
75             scanf("%s", Map);
76             for(int j = 0; j < 5; j++)
77                 if(Map[j] == '*')a[i][j] = 2, x = i, y = j;
78                 else a[i][j] = Map[j] - '0';
79         }
80         for(k = 1; k <= 15; k++)
81         {
82             Search(0, a, x, y);
83             if(flag){printf("%d\n", k);break;}
84         }
85         if(!flag)printf("-1\n");
86
87     }
88     return Accepted;
89 }

转载于:https://www.cnblogs.com/fzl194/p/9722469.html

BZOJ 1085 骑士精神 迭代加深搜索+A*相关推荐

  1. BZOJ 1085 骑士精神

    Time Limit: 10 Sec Memory Limit: 162 MB Submit: 3229 Solved: 1908 [Submit][Status][Discuss] Descript ...

  2. 算法复习——迭代加深搜索(骑士精神bzoj1085)

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

  3. P2324 [SCOI2005]骑士精神(迭代加深搜索,dfs)

    传送门 文章目录 解析 解析 很显然,让马走的话状态记录和转移都会比较复杂 所以转化成让空位跳会更好做一点 但这不是重点 初看本题,其实第一感觉是bfs 但是状态数理论上最差可以达到815,(当然基本 ...

  4. 迭代加深搜索 C++解题报告 :[SCOI2005]骑士精神

    题目 此题根据题目可知是迭代加深搜索. 首先应该枚举空格的位置,让空格像一个马一样移动. 但迭代加深搜索之后时间复杂度还是非常的高,根本过不了题. 感觉也想不出什么减枝,于是便要用到了乐观估计函数(O ...

  5. 搜索进阶之迭代加深搜索

    迭代加深搜索 首先这个不要怕这个东西,其实我刚开始学这个搜索也觉得特别高大上,觉得都是很高大上让人听不懂的专业术语,其实说白了迭代加深搜索的思想和精髓就是控制了搜索深度的dfs,但是却能够达到广搜的效 ...

  6. hdu 1560 DNA sequence(迭代加深搜索)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1560 题意:从n个串中找出一个最短的公共串,,该公共串对于n个字符串不要求连续,即只要保持相对顺序就好 ...

  7. 紫书搜索 习题7-8 UVA - 12107 Digit Puzzle IDA*迭代加深搜索

    题目链接: https://vjudge.net/problem/UVA-12107 题意: 给出一个数字谜,要求修改尽量少的数,使修改后的数字谜只有唯一解.空格和数字可以随意替换,但不能增删,数字谜 ...

  8. UVA - 11214Guarding the Chessboard守卫棋盘(迭代加深搜索)

    题意:输入一个n*m棋盘(0<n,m<10),某些格子有标记.用最少的皇后守卫所有带标记的格子.皇后规则是所在坐标的直线和斜线都可以被守卫,长度不限. 分析:因为不知道深度,所以用迭代加深 ...

  9. 迭代加深搜索与埃及分数求解

    迭代加深搜索,实质上是限定下界的深度优先搜索.即首先允许深度优先搜索K层,若没有发现可行解,再将K+1后 重复以上步骤搜索,直到搜索到可行解. 在迭代加深搜索的算法中,连续的深度优先搜索被引入,每一个 ...

最新文章

  1. c# winform快捷键设置
  2. 《时间简史》(评论一)(转载)
  3. wxWidgets:wxHtmlCellEvent类用法
  4. 以前的项目今日打开突然报错了!
  5. 模拟服务器和客户端交互的python脚本
  6. 2013应届毕业生“百度”校招应聘总结
  7. 射频识别实训总结_个人总结
  8. Windows XP增强dos命令
  9. html 怎么设置时间函数,JavaScript日期函数 - 计时器、innerHTML
  10. TypeError: cannot unpack non-iterable int object查找指定文件夹下指定文件类型的数量
  11. 计算机office软件版本,office哪个版本最好用,你在用的office是哪个版本
  12. conda环境下更新pip失败
  13. 测试用例的粒度和评价
  14. Eureka注册服务列表显示ip+端口
  15. 【2020牛客多校】第九场 K The Flee Plan of Groundhog——BFS
  16. 应届生想做产品经理该怎么走?
  17. Python上使用及安装tesseract
  18. 设计师如何吸引用户注意力?
  19. 名帖123 徐祯卿 小楷《为朱君募买驴疏》
  20. 路漫漫远修兮-centos7 oracle 11g 静默安装教程

热门文章

  1. 比特安详细解析Fantasm Finance事件:注重细节,才能历久弥新
  2. Pyramid Squeeze Attention
  3. Linux网管学习笔记(26)Linux操作系统学习路线图
  4. Revit (5) - 二开 -创建墙体
  5. sklearn.linear_model之LinearRegression核心源码解析
  6. 【C-函数】scanf函数原理
  7. 回归分析模型优劣判断
  8. 逻辑分析仪Kingst第一天
  9. 关于彩虹字体和渐变字体
  10. 用计算机弹歌曲谱子,计算器弹歌曲谱子