P2324 [SCOI2005]骑士精神

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*)的更多相关文章

  1. [luogu P2324] [SCOI2005]骑士精神

    [luogu P2324] [SCOI2005]骑士精神 题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1 ...

  2. 洛谷 P2324 [SCOI2005]骑士精神 解题报告

    P2324 [SCOI2005]骑士精神 题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,* ...

  3. 【题解】P2324 [SCOI2005]骑士精神

    ·有关IDA* 是带有估值函数的迭代加深搜索,表现出出色的效率. 估值函数可以简单的定义为「已经到位的骑士的个数」. 然后就是普通的迭代加深了. 算法酷炫不一定赢,搜索好才是成功. ——Loli Co ...

  4. 【luogu P2324 [SCOI2005]骑士精神】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2324 不懂怎么剪枝,所以说,,我需要氧气.. 第一道A* // luogu-judger-enable-o2 ...

  5. Luogo P2324 [SCOI2005]骑士精神

    所有想练习A*的人都先来敲一下这道题吧. 数据范围即便只有5*5,但朴素的爆搜还是会超时. 因此考虑剪枝. 对于这道题,肯定只要进行最优化剪枝,判断现在走的步数+剩下最少要走的步数,如果大于ans或者 ...

  6. P2324 [SCOI2005]骑士精神

    题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,*表示空位.两组数据之间没有空行. 输出格式 ...

  7. 洛谷 P2324 [SCOI2005]骑士精神

    题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,*表示空位.两组数据之间没有空行. 输出格式 ...

  8. 洛谷P2324 [SCOI2005] 骑士精神

    题目 方法很多,最经典的是用搜索的算法,也就是\(IDA*\)算法搜索. \(IDA*\)算法是每次规定一个搜索深度,并在搜索的时候限制该搜索深度,从而达到把深搜的优点和广搜的优点结合起来优化时间的一 ...

  9. Luogu P2324 [SCOI2005]骑士精神 搜索

    刚开始写了个没迭代的...结果过了$qwq$ 然后迭个代..更快了.. #include<cstdio> #include<iostream> #define R regist ...

随机推荐

  1. 苹果账号需要的邓白氏D-U-N-S编码更新信息最新方法,官方已不受理邮件

    公司从上海搬迁到深圳,公司名称相应变更,但之前注册的苹果开发者账号上的名字还是就的,尝试在后台提交更新申请,官方给了邮件,要求邮件提交证明材料,证明材料提交后,苹果又反馈和邓白氏的资料不匹配,要求先修 ...

  2. 361-基于6U VPX TMS320C6678+XC7K325T 的信号处理板

    基于6U VPX TMS320C6678+XC7K325T 的信号处理板 一.板卡概述 本板卡基于6U VPX结构设计无线电信号处理平台.板卡包含1片C6678芯片,1片 FPGA XC7K325T- ...

  3. Ubuntu16.04 启用root权限

    装了Ubuntu 16.04之后想使用超级权限对系统进行操作 使用命令 su - 切换超级用户,提示输入密码,却怎么都不对,网上找的资料说是没有启用root权限,于是根据网上提供的方法启用root权限 ...

  4. Linux 查找指定内容在哪个文件中

    在实际的工作中,忘记配置项放在哪个文件中时,可借助命令来查询. eg: 1.grep -r "查询内容"  文件目录    #这样查询出来的包括文件名+内容 grep -r -l ...

  5. Test 6.23 T1 扫雷

    题目背景 题目描述 输入格式 输出格式 样例输入输出 数据范围 解析 我们设两个作弊器的参数分别为\((a_1,b_1)\)和\((a_2,b_2)\),那么设 \[ S1=\frac{a_1}{b_ ...

  6. Angular:实现组件间双向数据绑定

    学过Angular的同学都知道,输入框通过[(ngModel)]实现双向数据绑定,那么父子组件间能不能实现双向数据绑定呢?答案是肯定的. Angular中,我们常常需要通过方括号[]和圆括号()实现组 ...

  7. PHP 判断是否为手机端访问

    /* * 判断是否为手机端 */function check_wap(){ // 如果有HTTP_X_WAP_PROFILE则一定是移动设备 if (isset ($_SERVER['HTTP_X_W ...

  8. Linux下MySQL 5.5的修改字符集编码为UTF8(彻底解决中文乱码问题)

    一.登录MySQL查看用SHOW VARIABLES LIKE 'character%';下字符集,显示如下: +--------------------------+---------------- ...

  9. 转载:TypeError: Cannot read property 'compilation' of undefined vue 打包运行npm run build 报错

    转载自:https://www.jianshu.com/p/3f8f60e01797 运行npm run build打包时,报错如下:   我的package.json如下: { ... " ...

  10. django缓存优化(二)

    一.缓存目的: 1.减小过载 2.避免重复计算 3.提高系统性能 二.如何进行缓存 三.缓存类型 四.缓存粒度分类 五.缓存的设置与使用 示例一: CACHES = { 'default': { 'B ...