BZOJ 1085 骑士精神 迭代加深搜索+A*
题目链接:
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*相关推荐
- BZOJ 1085 骑士精神
Time Limit: 10 Sec Memory Limit: 162 MB Submit: 3229 Solved: 1908 [Submit][Status][Discuss] Descript ...
- 算法复习——迭代加深搜索(骑士精神bzoj1085)
题目: Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑 士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标 ...
- P2324 [SCOI2005]骑士精神(迭代加深搜索,dfs)
传送门 文章目录 解析 解析 很显然,让马走的话状态记录和转移都会比较复杂 所以转化成让空位跳会更好做一点 但这不是重点 初看本题,其实第一感觉是bfs 但是状态数理论上最差可以达到815,(当然基本 ...
- 迭代加深搜索 C++解题报告 :[SCOI2005]骑士精神
题目 此题根据题目可知是迭代加深搜索. 首先应该枚举空格的位置,让空格像一个马一样移动. 但迭代加深搜索之后时间复杂度还是非常的高,根本过不了题. 感觉也想不出什么减枝,于是便要用到了乐观估计函数(O ...
- 搜索进阶之迭代加深搜索
迭代加深搜索 首先这个不要怕这个东西,其实我刚开始学这个搜索也觉得特别高大上,觉得都是很高大上让人听不懂的专业术语,其实说白了迭代加深搜索的思想和精髓就是控制了搜索深度的dfs,但是却能够达到广搜的效 ...
- hdu 1560 DNA sequence(迭代加深搜索)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1560 题意:从n个串中找出一个最短的公共串,,该公共串对于n个字符串不要求连续,即只要保持相对顺序就好 ...
- 紫书搜索 习题7-8 UVA - 12107 Digit Puzzle IDA*迭代加深搜索
题目链接: https://vjudge.net/problem/UVA-12107 题意: 给出一个数字谜,要求修改尽量少的数,使修改后的数字谜只有唯一解.空格和数字可以随意替换,但不能增删,数字谜 ...
- UVA - 11214Guarding the Chessboard守卫棋盘(迭代加深搜索)
题意:输入一个n*m棋盘(0<n,m<10),某些格子有标记.用最少的皇后守卫所有带标记的格子.皇后规则是所在坐标的直线和斜线都可以被守卫,长度不限. 分析:因为不知道深度,所以用迭代加深 ...
- 迭代加深搜索与埃及分数求解
迭代加深搜索,实质上是限定下界的深度优先搜索.即首先允许深度优先搜索K层,若没有发现可行解,再将K+1后 重复以上步骤搜索,直到搜索到可行解. 在迭代加深搜索的算法中,连续的深度优先搜索被引入,每一个 ...
最新文章
- c# winform快捷键设置
- 《时间简史》(评论一)(转载)
- wxWidgets:wxHtmlCellEvent类用法
- 以前的项目今日打开突然报错了!
- 模拟服务器和客户端交互的python脚本
- 2013应届毕业生“百度”校招应聘总结
- 射频识别实训总结_个人总结
- Windows XP增强dos命令
- html 怎么设置时间函数,JavaScript日期函数 - 计时器、innerHTML
- TypeError: cannot unpack non-iterable int object查找指定文件夹下指定文件类型的数量
- 计算机office软件版本,office哪个版本最好用,你在用的office是哪个版本
- conda环境下更新pip失败
- 测试用例的粒度和评价
- Eureka注册服务列表显示ip+端口
- 【2020牛客多校】第九场 K The Flee Plan of Groundhog——BFS
- 应届生想做产品经理该怎么走?
- Python上使用及安装tesseract
- 设计师如何吸引用户注意力?
- 名帖123 徐祯卿 小楷《为朱君募买驴疏》
- 路漫漫远修兮-centos7 oracle 11g 静默安装教程