[luogu P2324] [SCOI2005]骑士精神
[luogu P2324] [SCOI2005]骑士精神
题目描述

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

看了一下ida*,发现真的比a*简单多了。。ida*无非就是设定一个预期步数,然后运用a*的思想,即——
如果当期实际步数+估计剩余步数>预期步数,则return。显然,估计剩余步数一定不超过实际剩余步数,否则会漏掉最优解。
对于这题来说,估计剩余步数可以采取错位数-1。
错位数即每一个位置上与目标不一致的数量,减一是因为可能在最后用1步能减掉2个错位数,毕竟估价函数越小,可能效率越低,但是至少错误率下降了,对与这题,错误率就为0了。
那什么题目适合ida*呢?当预期步数不大,但是每一层状态数很多时,就适合ida*,毕竟这时bfs已经不适用了。
code:
%:pragma GCC optimize()
#include<bits/stdc++.h>
#define swap(x,y) ((x)^=(y)^=(x)^=(y))
using namespace std;
][]={{,,,,},{,,,,},{,,,,},{,,,,},{,,,,}};
][]={{,},{,},{-,},{-,},{,-},{,-},{-,-},{-,-}};
][],ori[][],dis[][];
inline int get() {
;
; i<=n; i++)
; j<=n; j++)
ret+=(a[i][j]!=aim[i-][j-]);
return ret;
}
inline void idastar(int d,int x,int y) {
) return; int c=get();
) {rea=d; return;}
>s) return;
; i<; i++) {
],yy=y+fl[i][];
||xx>n||yy<||yy>n) continue;
swap(a[x][y],a[xx][yy]);
idastar(d+,xx,yy);
) return;
swap(a[x][y],a[xx][yy]);
}
}
int main() {
];
scanf(;
for (; T; T--) {
rea=;
; i<=n; i++) {
scanf();
; j<=n; j++)
ori[i][j]=(c[j]==:c[j]-;
}
; i<=n; i++)
; j<=; j++)
) {sx=i,sy=j; break;}
; s<=; s++) {
memcpy(a,ori,sizeof a);
idastar(,sx,sy);
) break;
}
) puts("-1"); else printf("%d\n",rea);
}
;
}
[luogu P2324] [SCOI2005]骑士精神的更多相关文章
- 【luogu P2324 [SCOI2005]骑士精神】 题解
题目链接:https://www.luogu.org/problemnew/show/P2324 不懂怎么剪枝,所以说,,我需要氧气.. 第一道A* // luogu-judger-enable-o2 ...
- Luogu P2324 [SCOI2005]骑士精神 搜索
刚开始写了个没迭代的...结果过了$qwq$ 然后迭个代..更快了.. #include<cstdio> #include<iostream> #define R regist ...
- 洛谷 P2324 [SCOI2005]骑士精神 解题报告
P2324 [SCOI2005]骑士精神 题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,* ...
- P2324 [SCOI2005]骑士精神(A*)
P2324 [SCOI2005]骑士精神 A*与爆搜的不同就是它有一个估价函数$h(x)$ 这个估价函数一般设为从当前状态到终点状态的估计最短步数,这样可以有效剪枝 但估计值必须严格小于等于实际剩余步 ...
- 【题解】P2324 [SCOI2005]骑士精神
·有关IDA* 是带有估值函数的迭代加深搜索,表现出出色的效率. 估值函数可以简单的定义为「已经到位的骑士的个数」. 然后就是普通的迭代加深了. 算法酷炫不一定赢,搜索好才是成功. ——Loli Co ...
- Luogo P2324 [SCOI2005]骑士精神
所有想练习A*的人都先来敲一下这道题吧. 数据范围即便只有5*5,但朴素的爆搜还是会超时. 因此考虑剪枝. 对于这道题,肯定只要进行最优化剪枝,判断现在走的步数+剩下最少要走的步数,如果大于ans或者 ...
- P2324 [SCOI2005]骑士精神
题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,*表示空位.两组数据之间没有空行. 输出格式 ...
- 洛谷 P2324 [SCOI2005]骑士精神
题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,*表示空位.两组数据之间没有空行. 输出格式 ...
- 洛谷P2324 [SCOI2005] 骑士精神
题目 方法很多,最经典的是用搜索的算法,也就是\(IDA*\)算法搜索. \(IDA*\)算法是每次规定一个搜索深度,并在搜索的时候限制该搜索深度,从而达到把深搜的优点和广搜的优点结合起来优化时间的一 ...
随机推荐
- js try catch 的使用,容错处理
tag: js try catch 的使用,js容错处理 网友回答: try{ //正常执行 }catch(e/*你感觉会出错的 错误类型*/){ // 可能出现的意外 eg:用户自己操作失误 或者 ...
- 文档对象模型DOM
文档对象模型 DOM 1 DOM概述 1.1 什么是DOM 文档对象模型 Document Object Model 提供给用户操作document obj 的标准接口 文档对象模型 是表示和操作 H ...
- python学习 day07打卡 文件操作
本节主要内容: 初识文件操作 只读(r,rb) 只读(w,wb) 追加(a,ab) r+读写 w+写读 a+追加写读 其他操作方法 文件的修改以及另一种打开文件句柄的方法 一. 初识文件操作 使用py ...
- C++ 空字符('\0')和空格符(' ')
1.从字符串的长度:-->空字符的长度为0,空格符的长度为1. 2.虽然输出到屏幕是一样的,但是本质的ascii code 是不一样的,他们还是有区别的. #include<iostrea ...
- 【selenium2】【unittest】
#栗子 from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver ...
- Redis的EXPIRE过期机制介绍
概述在实际开发过程中经常会遇到一些有时效性数据,比如限时优惠活动,缓存或者验证码之类的.过了一段时间就需要删除这些数据.在关系型数据库中一般都要增加一个字段记录数据的到期时间,然后周期性地检查过期数据 ...
- 3.git、TortoiseGit的安装、仓库的配置教程
参考:https://blog.csdn.net/hc_ttxs/article/details/79375788 引言: Git: 就是最原始的分布式版本控制系统,是开源的. GitHub:与Git ...
- oracle中索引的使用
声明:以下内容是自己跟着教学视屏学习之后整理而来(主要是自用),如有侵权请告知,将尽快删除. 一.索引 1. 概述:数据库对象之一索引用于提高查询效率索引的内建工作对用户是透明的,由数据库自行维护,我 ...
- VMWare16安装windows7遇到的一些问题
本人写这篇博客是为了记录了一些自己在使用VMware16安装Windows7时遇到的一些问题.本人使用的Windows7 ios镜像是小于4g的镜像. Windows7 ios的镜像地址为:https ...
- 有了art-template,如有神助
<div class="form-group col-lg-12"> <label class="control-label col-lg-3 text ...