Luogo P2324 [SCOI2005]骑士精神
所有想练习A*的人都先来敲一下这道题吧。
数据范围即便只有5*5,但朴素的爆搜还是会超时。
因此考虑剪枝。
对于这道题,肯定只要进行最优化剪枝,判断现在走的步数+剩下最少要走的步数,如果大于ans或者15就return;
那么,估价函数怎么写?
利用小学生的思想,将目前的图与目标状态对比一下,还有多少棋子没有归位,那么至少就要走几步(每次最多归位一个)
还有一个技巧:存储空格的位置,这样可以简化搜索。
CODE
#include<cstdio>
#include<iostream>
using namespace std;
const int g[][]=
{
{,,,,,},
{,,,,,},
{,,,,,},
{,,,,,},
{,,,,,},
{,,,,,},
};
const int fx[]={,,-,-,,,-,-},fy[]={,-,,-,,-,,-};
int t,a[][],ans,i,j,x,y;
char ch;
inline int h()
{
int tot=;
for (int i=;i<=;++i)
for (int j=;j<=;++j)
if (a[i][j]!=g[i][j]) ++tot;
return tot;
}
inline void Astar(int k,int x,int y)
{
if (!h()) ans=k<ans?k:ans;
if (k+h()>ans) return;
for (int i=;i<;++i)
{
int xx=fx[i]+x,yy=fy[i]+y;
if (xx>&&yy>&&xx<=&&yy<=)
{
swap(a[x][y],a[xx][yy]);
Astar(k+,xx,yy);
swap(a[x][y],a[xx][yy]);
}
}
}
int main()
{
scanf("%d",&t);
while (t--)
{
for (i=;i<=;++i)
{
for (j=;j<=;++j)
{
cin>>ch;
if (ch=='') a[i][j]=; else if (ch=='') a[i][j]=; else x=i,y=j,a[i][j]=;
}
}
ans=;
Astar(,x,y);
if (ans>) puts("-1"); else printf("%d\n",ans);
}
return ;
}
Luogo P2324 [SCOI2005]骑士精神的更多相关文章
- [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]骑士精神(A*)
P2324 [SCOI2005]骑士精神 A*与爆搜的不同就是它有一个估价函数$h(x)$ 这个估价函数一般设为从当前状态到终点状态的估计最短步数,这样可以有效剪枝 但估计值必须严格小于等于实际剩余步 ...
- 【题解】P2324 [SCOI2005]骑士精神
·有关IDA* 是带有估值函数的迭代加深搜索,表现出出色的效率. 估值函数可以简单的定义为「已经到位的骑士的个数」. 然后就是普通的迭代加深了. 算法酷炫不一定赢,搜索好才是成功. ——Loli Co ...
- 【luogu P2324 [SCOI2005]骑士精神】 题解
题目链接:https://www.luogu.org/problemnew/show/P2324 不懂怎么剪枝,所以说,,我需要氧气.. 第一道A* // luogu-judger-enable-o2 ...
- 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 ...
随机推荐
- springboot 学习之路 14(整合mongodb的Api操作)
springboot整合mongodb: mongodb的安装和权限配置 请点击连接参考 mongodb集成 : 第一步:引如pom文件 第二步:配置文件配置mongodb路径: 第三步:关于mon ...
- Python Django框架笔记(二):创建应用和django 管理
#前提是已经创建项目 (一) 创建应用 使用命令,在项目中创建一个应用(blog自定义) python manage.py startapp blog 创建完成后,可以看到下面几个文件 文件 ...
- Python数据类型之list和tuple
list是一种有序的集合,可以随时添加和删除其中的元素. 用len()函数可以获得list元素的个数. 用索引来访问list中每一个位置的元素,索引是从0开始的.如果要取最后一个元素,除了计算索引位置 ...
- C#安全加密类
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.S ...
- Oracle EBS CST 成本请求报错
(文档 ID 430533.1) When running CMCPAW, Periodic Actual Cost Worker, an error is received in the logf ...
- linux操作系统不重启添加raid0步骤
1.限制:本步骤仅适用于LSI芯片的raid卡,可以通过以下蓝色指令判断是否LSI芯片 [root@HKC-Lab-CDN ~]# lspci | grep -i lsi 03:00.0 RAID b ...
- [cb]UIGrid+UIStretch的自适应
自适应需求 如下图所示:一个Grid下面有六个Button,它们需要在不同的分辨下拉伸适应(Horizontal)宽度,以保证填充满底部 要点分析 首先有这两个要点 1.UIGrid中的Cell Wi ...
- ubuntu下如何设置中文输入法
许多朋友在用ubuntu操作系统时,因没有中文输入法而苦恼!今天我就和大家分享一下如何在ubuntu下设置如输入法的简单方法: 1 在任务栏的右上角设置选项-——>system settings ...
- Markdown 进阶
目录 markdown进阶语法 内容目录 加强代码块 脚注 流程图 时序图 LaTeX公式 markdown进阶语法 内容目录 使用 [TOC] 引用目录,将 [TOC] 放至文本的首行,编辑器将自动 ...
- ESXI6.0新添加硬盘未能格式化成功
最近练手,手头现有的硬盘是从其他机器上拆下来的,插入ESXI主机上,然后在系统配置硬盘的时候,不能格式化 报错 提示如下错误:"在ESXi"xxx.xxx.xxx.xxx" ...