【题解】P2324 [SCOI2005]骑士精神
·有关IDA*
是带有估值函数的迭代加深搜索,表现出出色的效率。
估值函数可以简单的定义为「已经到位的骑士的个数」。
然后就是普通的迭代加深了。
算法酷炫不一定赢,搜索好才是成功。
——Loli
Code:
#include <iostream>
#include <math.h>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <fstream>
#define re register
#define GC getchar()
#define Clean(X,K) memset(X,K,sizeof(X))
#define Jud(X,Y) (X<0||X>=N||Y<0||Y>=N)
using namespace std ;
int Qread () {
int X = ;
char C = GC ;
while (C > '' || C < '') C = GC ;
while (C >='' && C <='') {
X = X * + C - '' ;
C = GC ;
}
return X ;
}
const int Dx[] = {,,-,-,,,-,-},Dy[] = {,-,,-,,-,,-},N = , Aim[N + ][N + ] = {
{,,,,,-},
{,,,,,-},
{,,,,,-},
{,,,,,-},
{,,,,,-},
{-,-,-,-,-,-}
};
int A[N + ][N + ] , Sx , Sy ;
int G () {
int Ans = ;
for (re int i = ; i < N; ++ i) for (re int j = ; j < N; ++ j) if (A[i][j] != Aim[i][j]) ++ Ans ;
return Ans ;
}
int Ans , Fl = ;
void DFS (int X , int Y , int Stp) {
int Star = G() ;
if (Stp + Star > Ans + ) return ;
if (Fl) return ;
if (Star == ) {
Fl = ;
return ;
}
for (re int i = ; i < ;++ i) {
int Tx = Dx[i] + X , Ty = Dy[i] + Y ;
if (Jud(Tx , Ty)) continue ;
swap(A[X][Y] , A[Tx][Ty]) ;
DFS (Tx , Ty , Stp + ) ;
swap (A[X][Y] , A[Tx][Ty]) ;
}
}
int main () {
// freopen ("P2324.in" , "r" , stdin) ;
int Times = Qread () ;
while (Times -- ) {
for (re int i = ; i < N; ++ i) {
for (re int j = ; j < N; ++ j) {
char C = GC ;
while (C != '*' && C != '' && C != '') C = GC ;
if (C == '') A[i][j] = ;
if (C == '') A[i][j] = ;
if (C == '*') {
A[i][j] = ;
Sx = i , Sy = j ;
}
}
}
Fl = ;
for (Ans = ; Ans <= ; ++ Ans) {
DFS (Sx , Sy , ) ;
if (Fl) {
cout << Ans <<endl;
break ;
}
}
if (!Fl)cout << - <<endl;
}
fclose (stdin) , fclose (stdout) ;
return ;
}
Thanks!
【题解】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)$ 这个估价函数一般设为从当前状态到终点状态的估计最短步数,这样可以有效剪枝 但估计值必须严格小于等于实际剩余步 ...
- 【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 ...
随机推荐
- TCP连接有效性检测方法
在写TCP服务的时候经常需要面对的问题就是如何知道一个TCP连接当前是否有效,但这个问题对很多初入门的同学来说是很困惑的,主要原因是当对方关闭连接后,另一方无法有效的知道:对于同步操作来说可以通过设置 ...
- springboot情操陶冶-@ConfigurationProperties注解解析
承接前文springboot情操陶冶-@Configuration注解解析,本文将在前文的基础上阐述@ConfigurationProperties注解的使用 @ConfigurationProper ...
- 巨杉数据库加入CNCF云原生应用计算基金会,共建开源技术生态
近日,巨杉数据库正式加入全球顶级开源社区,云原生应用计算基金会 (Cloud Native Computing Foundation,以下简称CNCF),成为CNCF基金会会员,是中国最早加入的开源云 ...
- Spring Cloud Alibaba基础教程:Nacos的数据持久化
前情回顾: <Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现> <Spring Cloud Alibaba基础教程:支持的几种服务消费方式> ...
- 第7章 贡献 - Identity Server 4 中文文档(v1.0.0)
我们对社区贡献非常开放,但您应该遵循一些指导原则,以便我们可以毫不费力地处理这个问题. 7.1 如何贡献? 最简单的方法是打开一个问题并开始讨论.然后我们可以决定是否以及如何实现功能或更改.如果您应提 ...
- Docker搭建MongoDB
1. Docker搭建Mongodb 1.1 获取docker镜像 docker pull mongo 1.2 创建mongodb容器 docker run --name my-mongo -p 27 ...
- Array的 map() 和 reduce()
map() map() 方法返回一个新数组,新数组中的元素为原始数组中的元素依次调用参数中的函数处理后的值. map() 方法不会对空数组进行检测,也不会修改原数组. 语法: array.map(fu ...
- JS最简单的字符串转数字类型
以前无休止的写parseInt,特别复杂,现在只需要一个加号,就可以完成对字符串的转换 1 === +"1" amazing!
- 如何解决Dynamics 365的错误:用户身份验证无效,MSIS0006
关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复246或者20170312可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...
- Android系统的三种分屏显示模式
Google在Android 7.0中引入了一个新特性——多窗口支持,允许用户一次在屏幕上打开两个应用.在手持设备上,两个应用可以在"分屏"模式中左右并排或上下并排显示.在电视设备 ...