【洛谷】2324:[SCOI2005]骑士精神【IDA*】
P2324 [SCOI2005]骑士精神
题目描述

输入输出格式
输入格式:
第一行有一个正整数T(T<=10),表示一共有N组数据。接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,*表示空位。两组数据之间没有空行。
输出格式:
对于每组数据都输出一行。如果能在15步以内(包括15步)到达目标状态,则输出步数,否则输出-1。
输入输出样例
说明

喜欢了!不枉我研究那么久搜索QAQ
不过还是卡了一会儿,因为在估价时不能算空格,空格是跟随别人走的。
然后就是迭代加深和A*的套路了...枚举最大深度,估价剪枝,然后直接暴力跳就行叻!
#include<bits/stdc++.h>
using namespace std; int maxdep; int zl[][] = {{, }, {-, }, {, }, {-, }, {, -}, {-, -}, {, -}, {-, -}}; int st[][], now[][], G[][];
char s[][]; void init() {
for(int i = ; i <= ; i ++)
for(int j = ; j <= ; j ++) {
if(i <= && j >= i) st[i][j] = ;
else if(i <= && j < ) st[i][j] = ;
else if(i == && j == ) st[i][j] = ;
else if(i >= && j <= i) st[i][j] = ;
else st[i][j] = ;
}
} bool check() {
for(int i = ; i <= ; i ++)
for(int j = ; j <= ; j ++) {
if(now[i][j] != st[i][j]) return ;
}
return ;
} int cot(int x, int y) {
int num = ;
for(int i = ; i <= ; i ++)
for(int j = ; j <= ; j ++)
if(st[i][j] != now[i][j] && st[i][j] != ) num ++;
return num;
} bool pd(int x, int y) {
if(x >= && x <= && y >= && y <= ) return ;
return ;
} int fl, flag;
void dfs(int dep, int x, int y) {
if(fl) return ;
if(dep == maxdep) {
if(check()) fl = ;
return ;
}
if(dep + cot(x, y) > maxdep) return ;
for(int i = ; i < ; i ++) {
int xx = x + zl[i][], yy = y + zl[i][];
if(pd(xx, yy)) {
swap(now[x][y], now[xx][yy]);
dfs(dep + , xx, yy);
if(fl) return ;
swap(now[x][y], now[xx][yy]);
}
}
if(fl) return ;
} int main() {
int T;
scanf("%d\n", &T);
init();
while(T --) {
int x, y;
flag = ;
for(int i = ; i <= ; i ++) {
scanf("%s", s[i] + );
}
for(int i = ; i <= ; i ++) {
for(int j = ; j <= ; j ++) {
if(s[i][j] == '') G[i][j] = ;
else if(s[i][j] == '') G[i][j] = ;
else G[i][j] = , x = i, y = j;
}
}
for(maxdep = ; maxdep <= ; maxdep ++) {
fl = ;
for(int i = ; i <= ; i ++)
for(int j = ; j <= ; j ++)
now[i][j] = G[i][j];
dfs(, x, y);
if(fl) {
printf("%d\n", maxdep); flag = ; break;
}
}
if(!flag) printf("-1\n");
}
return ;
}
【洛谷】2324:[SCOI2005]骑士精神【IDA*】的更多相关文章
- 洛谷 P2324 [SCOI2005]骑士精神 解题报告
P2324 [SCOI2005]骑士精神 题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,* ...
- 洛谷P2324 [SCOI2005] 骑士精神
题目 方法很多,最经典的是用搜索的算法,也就是\(IDA*\)算法搜索. \(IDA*\)算法是每次规定一个搜索深度,并在搜索的时候限制该搜索深度,从而达到把深搜的优点和广搜的优点结合起来优化时间的一 ...
- 洛谷 P2324 [SCOI2005]骑士精神
题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,*表示空位.两组数据之间没有空行. 输出格式 ...
- 【洛谷2324】[SCOI2005]骑士精神 IDA*
[SCOI2005]骑士精神 描述 在一个\(5×5\)的棋盘上有\(12\)个白色的骑士和\(12\)个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑 士的走法(它可以走到和它横坐标相差为 ...
- [BZOJ 1085] [SCOI2005] 骑士精神 [ IDA* 搜索 ]
题目链接 : BZOJ 1085 题目分析 : 本题中可能的状态会有 (2^24) * 25 种状态,需要使用优秀的搜索方式和一些优化技巧. 我使用的是 IDA* 搜索,从小到大枚举步数,每次 DFS ...
- bzoj 1085: [SCOI2005]骑士精神 IDA*
题目链接 给一个图, 目标位置是确定的, 问你能否在15步之内达到目标位置. 因为只有15步, 所以直接ida* #include<bits/stdc++.h> using namespa ...
- bzoj1085 [SCOI2005]骑士精神——IDA*
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1085 搜索,IDA*,估价就是最少需要跳的步数: 代码意外地挺好写的,memcmp 用起来好 ...
- bzoj 1085 [SCOI2005]骑士精神——IDA*
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1085 迭代加深搜索. 估价函数是为了预计步数来剪枝,所以要优于实际步数. 没错,不是为了确定 ...
- BZOJ1085: [SCOI2005]骑士精神 [迭代加深搜索 IDA*]
1085: [SCOI2005]骑士精神 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1800 Solved: 984[Submit][Statu ...
随机推荐
- Struts2笔记3--获取ServletAPI和OGNL与值栈
获取ServletAPI: 第一种方式: //在request域中放入属性req,暂且认为getContext()获取的是request域空间,但实际不是 ActionContext.getConte ...
- mysql insert锁机制【转】
最近再找一些MySQL锁表原因,整理出来一部分sql语句会锁表的,方便查阅,整理的不是很全,都是工作中碰到的,会持续更新 笔者能力有限,如果有不正确的,或者不到位的地方,还请大家指出来,方便你我,方便 ...
- p,br,hn,b,i,u,s,sup,sub标签
<!-- -->注释 <p></p>段落标签 <br />换行标签 <h1></h1> 字体标签 最大 <h6> ...
- spring boot 测试用例
junit 是一个面向于研发人员使用的轻量的测试模块,适合做单元测试.而testng百度后发现更强大,可以做功能测试,但对于我这种RD,貌似junit足沟了呢! java Mock PowerMock ...
- vue总结 08状态管理vuex
状态管理 类 Flux 状态管理的官方实现 由于状态零散地分布在许多组件和组件之间的交互中,大型应用复杂度也经常逐渐增长.为了解决这个问题,Vue 提供 vuex:我们有受到 Elm 启发的状态管 ...
- 【前端vue开发】vue开发watch检测的使用
<span style="color:#006600;"><div id="app"> <input type="tex ...
- docker修改docker0 mtu
由于docker宿主机设置了mtu造成docker镜像中mtu和宿主机mtu不匹配,大包后网络不同.所以需要设置docker0的mtu. 1.修改docker.service vi /usr/lib/ ...
- nio复习总结
观察者: 多个对象依赖一个对象的状态, 当这个对象状态发生改变时,依次通知多个对象. 消息的分发和处理 事件驱动 / IO多路复用 借助select epoll等 reactor: io事件触发时, ...
- python中mock的使用
什么是mock? mock在翻译过来有模拟的意思.这里要介绍的mock是辅助单元测试的一个模块.它允许您用模拟对象替换您的系统的部分,并对它们已使用的方式进行断言. 在Python2.x 中 mock ...
- 20155309 《Java程序设计》实验三(Java面向对象程序设计)实验报告
一.实验内容及步骤 (一)编码标准 在IDEA中使用工具(Code->Reformate Code)把代码重新格式化. (二)在码云上把自己的学习搭档加入自己的项目中,确认搭档的项目加入自己后, ...