P2324 [SCOI2005]骑士精神(A*)
A*与爆搜的不同就是它有一个估价函数$h(x)$
这个估价函数一般设为从当前状态到终点状态的估计最短步数,这样可以有效剪枝
但估计值必须严格小于等于实际剩余步数,否则会剪枝过度而影响正确性
$g(x),f(x)$分别为剩余步数和已走步数,则:
$g(x)=f(x)+h(x)$
本题中的$h(x)$可以设为未归位的棋子数+1
因为每一步最多使一个棋子归位(除最后一步一次归位2个棋子)
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std; int d1[]={,,,,-,-,-,-};
int d2[]={,-,,-,,-,,-};
char a[][]; int re,col[][];
inline bool is(int x,int y){return (x==&&y==)?(a[x][y]=='*'):(a[x][y]==col[x][y]+'');}
void dfs(int d,int s,int x,int y){//d当前步数,s已归位棋子个数
if(d+-s>=re||d>) return ;//f(x)=d,g(x)=24-s
if(s==) {re=min(re,d); return ;}
for(int i=;i<;++i){
int rx=x+d1[i],ry=y+d2[i],p=s;
if(rx<||<rx||ry<||<ry) continue;
p-=is(x,y)+is(rx,ry);
swap(a[x][y],a[rx][ry]);
p+=is(x,y)+is(rx,ry);
dfs(d+,p,rx,ry);
swap(a[x][y],a[rx][ry]);
}
}
int main(){
for(int i=;i<=;++i) for(int j=i;j<=;++j) col[i][j]=;
col[][]=col[][]=;
int T,sum,fx,fy;scanf("%d",&T);
while(T--){
sum=; re=;
for(int i=;i<=;++i){
scanf("%s",a[i]+);
for(int j=;j<=;++j){
sum+=is(i,j);
if(a[i][j]=='*') fx=i,fy=j;
}
}dfs(,sum,fx,fy);
if(re>) re=-;
printf("%d\n",re);
}return ;
}
P2324 [SCOI2005]骑士精神(A*)的更多相关文章
- [luogu P2324] [SCOI2005]骑士精神
[luogu P2324] [SCOI2005]骑士精神 题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1 ...
- 洛谷 P2324 [SCOI2005]骑士精神 解题报告
P2324 [SCOI2005]骑士精神 题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,* ...
- 【题解】P2324 [SCOI2005]骑士精神
·有关IDA* 是带有估值函数的迭代加深搜索,表现出出色的效率. 估值函数可以简单的定义为「已经到位的骑士的个数」. 然后就是普通的迭代加深了. 算法酷炫不一定赢,搜索好才是成功. ——Loli Co ...
- 【luogu P2324 [SCOI2005]骑士精神】 题解
题目链接:https://www.luogu.org/problemnew/show/P2324 不懂怎么剪枝,所以说,,我需要氧气.. 第一道A* // luogu-judger-enable-o2 ...
- 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*\)算法是每次规定一个搜索深度,并在搜索的时候限制该搜索深度,从而达到把深搜的优点和广搜的优点结合起来优化时间的一 ...
- Luogu P2324 [SCOI2005]骑士精神 搜索
刚开始写了个没迭代的...结果过了$qwq$ 然后迭个代..更快了.. #include<cstdio> #include<iostream> #define R regist ...
随机推荐
- fiddler 手机抓包,CS端抓包 使用记录
1.允许远程连接 2.忽略https证书错误 3.设置代理 4.重启fiddle 5.PC客户端抓包分工具FIddler+Proxifer https://blog.csdn.net/sunbo_cs ...
- [thinkphp 5.0源码阅读] 缓存(一)
保存缓存: user表数据: cache()方法保存缓存: 访问 http://mythinkphp.com/index/index/cache ,两个缓存被保存(runtime/cache目录下): ...
- JVM的内存区域划分(jdk7和jdk8)
参考: https://blog.csdn.net/l1394049664/article/details/81486470?tdsourcetag=s_pctim_aiomsg https://bl ...
- Flutter-Boxdecoration邊框線, 圓角
decoration: BoxDecoration( borderRadius: BorderRadius.circular(8), border: Border( top: BorderSide( ...
- 如何在centos7中设置redis服务器开机自启动
1.简单说明centos7系统中有不同类型的程序,一类是操作系统的服务程序,另一类是第三方程序,而redis就是第三方程序,每次关机后开机都要手工重新启动,很麻烦,那么如何把redis设置为开机自启动 ...
- C++ begin()和end()
begin(a)指向数组a的第一个元素,end(a)指向数组a最后一个元素之后的一个元素 #include <iostream> using namespace std; int main ...
- php strpos()函数 语法
php strpos()函数 语法 作用:寻找字符串中某字符最先出现的位置.大理石平台怎么选择 语法:strpos(string,find,start) 参数: 参数 描述 string 必需 ...
- 学习笔记11 EF查询相当于sql 中的 where in
两种写法 1. int[] Ids={1,2,3} DBContainer db=new DBContainer(); var list=db.表明.where(a=>Ids.Contains( ...
- python-zx笔记11-测试压力管理
一.添加测试用例 calculator.py class Math: def __init__(self,a,b): self.a = int(a) self.b = int(b) def add(s ...
- OSI参考模型和网络排错
OSI七层协议 应用层 应用程序通信服务 表示层 显示 加密 数据格式 会话层 服务器和客户机建立会话 netstat -nb 查看会话 mscofig 传输层 可靠回话传输 分段 ...