题目

方法很多,最经典的是用搜索的算法,也就是\(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] 骑士精神的更多相关文章

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

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

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

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

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

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

  4. P2324 [SCOI2005]骑士精神(A*)

    P2324 [SCOI2005]骑士精神 A*与爆搜的不同就是它有一个估价函数$h(x)$ 这个估价函数一般设为从当前状态到终点状态的估计最短步数,这样可以有效剪枝 但估计值必须严格小于等于实际剩余步 ...

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

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

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

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

  7. Luogo P2324 [SCOI2005]骑士精神

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

  8. P2324 [SCOI2005]骑士精神

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

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

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

随机推荐

  1. PL/SQL不安装ORACLE客户端

    1.oracle官网下载instantclient,将包解压存放到本地. 在这个路径下D:\oracle-basic\instantclient_12_2\network\admin放入TNS文件. ...

  2. 翻译 API

    Request http://fy.iciba.com/ajax.php?a=fy&f=auto&t=auto&w=love Pre 英译汉 Request http://fy ...

  3. 大型三甲HIS系统最新C#源码医院信息管理系统NET源码门诊住院医嘱药房药库发药管理源码

    查看医疗信息管理his系统演示 本云his系统源码,适用在县乡一体化,医联体分级诊疗项目上,本源码开发语言asp.net c#,数据库sqlserver2012,开发工具vs2015.技术框架mvc. ...

  4. 2019年北航OO第三次博客总结

    一.JML语言理论基础及其工具链 1. JML语言理论基础 JML是用于对Java程序进行规格化设计的一种表示语言,是一种行为接口规格语言(Behavior Interface Specificati ...

  5. HelloWorld! C++纠错版

    例题:1 #include<iostream> int main() { cout << "HelloWorel!" ; ; } #include < ...

  6. UML软件工程第一次实验

    顶层设计 UC1诊所设备管理 UC1.1 统计设备使用情况 用况标识号 UC1.1 用况名称 统计设备使用情况 创建者 派克 创建时间 2017-9-25 参与者 客户 说明 客户需要知道自己诊所设备 ...

  7. 微信支付接口--支付成功的回调--超详细Demo

    如果本文对你有用,请爱心点个赞,提高排名,帮助更多的人.谢谢大家!❤ 如果解决不了,可以在文末进群交流. 如果对你有帮助的话麻烦点个[推荐]~最好还可以follow一下我的GitHub~感谢观看! 写 ...

  8. c# 搜索字符串

  9. 190919 centos系统中python2卸载重装

    问题:某些原因卸载了python2,连带卸载了yum工具. 解决思路: 如果服务器没有什么东西,重装系统最省事.但是如果不允许重装,那就只能按部就班的恢复python2和yum. 步骤: 删除pyth ...

  10. django配置*app*登录案例*orm简用

    1.静态文件的配置和使用 1.静态文件的配置和使用 没有css样式: 添加样式 结果: <html lang="en"> <head> <meta c ...