洛谷P2324 [SCOI2005] 骑士精神
方法很多,最经典的是用搜索的算法,也就是\(IDA*\)算法搜索。
\(IDA*\)算法是每次规定一个搜索深度,并在搜索的时候限制该搜索深度,从而达到把深搜的优点和广搜的优点结合起来优化时间的一个算法。
说白了,就是一个剪枝借鉴了广搜的思想。
#include <bits/stdc++.h>
using namespace std;
int di[60] = {1, -1, 2, -2, 1, -1, 2, -2};
int dj[60] = {2, 2, 1, 1, -2, -2, -1, -1};
int T, t, ans, si, sj;
int dp[10][10], data[10][10];
bool flag;
int enda[10][10] = {
{0, 0, 0, 0, 0, 0},
{0, 2, 2, 2, 2, 2},
{0, 1, 2, 2, 2, 2},
{0, 1, 1, 0, 2, 2},
{0, 1, 1, 1, 1, 2},
{0, 1, 1, 1, 1, 1},
};
inline bool cut(int nt)
{
int dis = 0;
for (int i = 1; i <= 5; i++)
for (int j = 1; j <= 5; j++)
if (data[i][j] != enda[i][j])
dis++;
if (dis + nt > t) return 0;
else return 1;
}
bool dfs(int nt, int i, int j)//nt就是当前深度
{
if (nt == t)//判断最终深度是否都已经到达最终的目标。
{
for (int i = 1; i <= 5; i++)
for (int j = 1; j <= 5; j++)
if (data[i][j] != enda[i][j])
return 0;
flag = 1;
}
if (flag) return 1;
for (int o = 0; o < 8; o++)
{
int ni = i + di[o], nj = j + dj[o];
if (ni <= 0 || ni > 5 || nj <= 0 || nj > 5) continue;
swap(data[i][j], data[ni][nj]);
if (cut(nt)) //剪枝,如果连最优的走法都走不过去就不能走了
bool a = dfs(nt + 1, ni, nj);
swap(data[i][j], data[ni][nj]);
}
return 0;
}
int main()
{
scanf("%d", &T);
while (T--)
{
ans = 0;
for (int i = 1; i <= 5; i++)
for (int j = 1; j <= 5; j++)
{
char c;
cin >> c;
if (c == '*') data[i][j] = 0, si = i, sj = j;
if (c == '0') data[i][j] = 1;
if (c == '1') data[i][j] = 2;
}
for (t = 1; t <= 15; t++)
{
if (ans) break;
flag = 0;
dfs(0, si, sj);
if (flag) ans = t;
}
printf("%d\n", ans ? ans : -1);
}
return 0;
}
/*
1
11111
01110
00*11
00001
00000
*/
洛谷P2324 [SCOI2005] 骑士精神的更多相关文章
- 洛谷 P2324 [SCOI2005]骑士精神 解题报告
P2324 [SCOI2005]骑士精神 题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,* ...
- 洛谷 P2324 [SCOI2005]骑士精神
题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,*表示空位.两组数据之间没有空行. 输出格式 ...
- [luogu P2324] [SCOI2005]骑士精神
[luogu 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 ...
- Luogo P2324 [SCOI2005]骑士精神
所有想练习A*的人都先来敲一下这道题吧. 数据范围即便只有5*5,但朴素的爆搜还是会超时. 因此考虑剪枝. 对于这道题,肯定只要进行最优化剪枝,判断现在走的步数+剩下最少要走的步数,如果大于ans或者 ...
- P2324 [SCOI2005]骑士精神
题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,*表示空位.两组数据之间没有空行. 输出格式 ...
- Luogu P2324 [SCOI2005]骑士精神 搜索
刚开始写了个没迭代的...结果过了$qwq$ 然后迭个代..更快了.. #include<cstdio> #include<iostream> #define R regist ...
随机推荐
- [高清] 深入浅出Spring Boot 2.x.pdf + 代码
------ 郑重声明 --------- 资源来自网络,纯粹共享交流, 如果喜欢,请您务必支持正版!! --------------------------------------------- 下 ...
- db跟随集群自启动
AME=ora.newora920.db TYPE=ora.database.type ACL=owner:oracle:rwx,pgrp:oinstall:r--,other::r--,group: ...
- springboot读取系统级环境变量,和读写系统属性以及unittest来获取环境变量的方法
环境变量的读取以及系统属性的设置 环境变量只能读取,不能修改,系统属性可以修改 系统变量的读取方式: System.getEnv() 系统属性有多重读取和修改方式: 其修改方式为: 读取系统属性: @ ...
- R_基本统计分析_06
summary()提供基础的统计信息 sapply(x,FUN,options)可以指定统计函数 fivenum()可以返回图基五数 Hmisc 中的describe(data)返回变量,观测的变量, ...
- Fatal error: Uncaught Error: Call to a member function bind_param() on boolean
1.2019年10月22日 PHP写mysqli 预编译查询的时候报错. Fatal error: Uncaught Error: Call to a member function bind_par ...
- Swift 4 中的泛型
作为Swift中最重要的特性之一,泛型使用起来很巧妙.很多人都不太能理解并使用泛型,特别是应用开发者.泛型最适合libraries, frameworks, and SDKs的开发.在这篇文章中,我将 ...
- 过滤器+用session验证是否登陆过
过滤器: public class MyActionFilter : ActionFilterAttribute//继承ActionFilterAttribute类 { public override ...
- SpringBoot AOP概念及使用Demo
AOP核心概念1.横切关注点 对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点2.切面(aspect)->(通知+切点) 类是对物体特征的抽象,切面就是对横切关注点的抽象.通知+切 ...
- 【转】TCP报文格式定义详解
TCP报文是TCP层传输的数据单元,也叫报文段. 1.端口号:用来标识同一台计算机的不同的应用进程. 1)源端口:源端口和IP地址的作用是标识报文的返回地址. 2)目的端口:端口指明接收方计算机上的应 ...
- CF: Long Number
题目链接 #include<iostream> #include<string> ...