Description

在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位。

在任何时候一个骑士都能按照骑
士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2,纵坐标相差为1的格子)移动到空
位上。

给定一个初始的棋盘,怎样才能经过移动变成如下目标棋盘: 为了体现出骑士精神,他们必须以最少的步
数完成任务。

目标状态:

Sample Input

2

10110

01*11

10111

01001

00000

01011

110*1

01110

01010

00100

Sample Output

7

-1

Hint

\(T \leqslant 10\)

Solution

最暴力:直接暴力动空格,复杂度 \(O(8^{step})\),有点 \(wei\)。。。

首先我们发现这题其实这个数据范围好像爆搜不大 \(wei\) ,再观察题面,发现这题说超过 \(15\) 步输出 \(-1\),emmm好像可以用迭代加深。

但是我们都知道迭代加深其实和宽搜差不了多少。。。还是过不了。

那咋的办。考虑对于所有爆搜的题大部分可以依靠 \(A*\) 获得不错的效率,当然不排除,\(A*\) 估价写 \(wei\) 丢失最优解。

关于估价函数的一些小细节:

  • 估价函数最好小于等于实际的函数值,比如k短路中我们以到终点的最短路作为估价函数。

  • 估价函数的构造肯定是和题目的要求答案有密不可分的关系。

举几个估价函数的小栗子:

  • 迷宫: 到终点的曼哈顿距离
  • K短路:到终点的最短路
  • 求最小步数归位:与终点的状态差距(距离)

由于博主太 \(wei\) 了,没得办法,就会这么点东西,再去刷刷YBT找找感觉。

但是,这样貌似复杂度还是有点高,至少我是过不了,神他喵忘判走过去又走回来的情况了,T飞了。。。

Code

#include<bits/stdc++.h>
using namespace std;
#define R registerint T;
bool flag=false;
const int N=7;
const int dx[]={2,1,-1,-2,-2,-1,1,2};
const int dy[]={1,2,2,1,-1,-2,-2,-1};
const int goal[N][N]={{0,0,0,0,0,0},{0,1,1,1,1,1},{0,0,1,1,1,1},{0,0,0,2,1,1},{0,0,0,0,0,1},{0,0,0,0,0,0}
};
int a[N][N];
char s[N][N];inline int h(){int ret=0;for(int i=1;i<=5;++i) for(int j=1;j<=5;++j)ret+=(a[i][j]!=goal[i][j]);return ret;
}inline bool check(){for(int i=1;i<=5;++i) for(int j=1;j<=5;++j)if(a[i][j]!=goal[i][j]) return true;return false;
}inline void A_star(int deep,int dep,int cx,int cy,int prex,int prey){if(dep==deep){if(!check()) flag=true;return;}for(int i=0;i<8;++i){int x=cx+dx[i],y=cy+dy[i];if(x<1 || x>5 || y<1 || y>5 || (x==prex&& y==prey)) continue;swap(a[cx][cy],a[x][y]);if(dep+h()<=15)A_star(deep,dep+1,x,y,cx,cy);swap(a[cx][cy],a[x][y]);}
}int main(){scanf("%d",&T);while(T--){int sx=0,sy=0;flag=false;for(R int i=1;i<=5;++i) scanf("%s",s[i]+1);for(R int i=1;i<=5;++i) for(int j=1;j<=5;++j){if(s[i][j]=='*') a[i][j]=2,sx=i,sy=j;else a[i][j]=s[i][j]-'0';}for(int i=1;i<=15;++i){A_star(i,0,sx,sy,0,0);if(flag==true){printf("%d\n",i);break;}}if(flag==false) puts("-1");}return 0;
}

转载于:https://www.cnblogs.com/JCNL666/p/10864936.html

【题解】P2324[SCOI2005] 骑士精神相关推荐

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

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

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

    目录 题目 思路 $Code$ 题目 戳 思路 $dfs$. $Code$ #include<iostream> #include<cstdio> #include<cs ...

  3. P2324 [SCOI2005]骑士精神(IDA*)

    思路:不是动骑士,而是动空格.只能动15次,证明搜索树的高的确定的,考虑IDA解决 IDA能很好地解决一些搜索中有上界的情况 大概就是搞一个估值函数,然后当前情况+估价函数>限制的情况直接剪掉这 ...

  4. P2324 [SCOI2005]骑士精神(迭代加深搜索,dfs)

    传送门 文章目录 解析 解析 很显然,让马走的话状态记录和转移都会比较复杂 所以转化成让空位跳会更好做一点 但这不是重点 初看本题,其实第一感觉是bfs 但是状态数理论上最差可以达到815,(当然基本 ...

  5. bzoj1085: [SCOI2005]骑士精神(a*)

    1085: [SCOI2005]骑士精神 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2555  Solved: 1472 [Submit][St ...

  6. BZOJ 1085 [SCOI2005]骑士精神 【A*启发式搜索】

    1085: [SCOI2005]骑士精神 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2838  Solved: 1663 [Submit][St ...

  7. bzoj 1085: [SCOI2005]骑士精神(IDA*)

    1085: [SCOI2005]骑士精神 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2296  Solved: 1328 [Submit][St ...

  8. [启发式搜索/A*] [SCOI2005]骑士精神题解

    洛谷-骑士精神 启发式搜索-A* 估价函数 对于当前状态,我们可以将其与目标状态对比,得到一个预估的代价,即最少(不一定满足题意)的代价,得到这个代价的函数叫做估价函数 对于一个最短路问题来说,我们可 ...

  9. BZOJ1085 [SCOI2005] 骑士精神

    [问题描述] 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑 士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2,纵坐标相 ...

最新文章

  1. [转帖]最新FLASH 0DAY 漏洞总结分析篇
  2. 最新以及历史各版本 .NET Framework 的下载
  3. 【财务思维课】固定资产是应该买呢还是租或是借呢?
  4. mysql scope runtime_Maven依赖scope属性详解-一个报错引发的问题 - 老郭种树
  5. String 类型切割成数组-转int数组-升列排序-拼接字符串、需求 有如下一个字符串 91 27 46 38 50
  6. 华农软件工程实验报告_华南农业大学的软件工程怎么样?
  7. WebApp 开发中常用的代码片段
  8. 图 子类 数据库_构造知识图的语义模型
  9. 筛选法建立初始堆_学术简报|基于库仑效率的退役锂离子动力电池储能梯次利用筛选...
  10. 解决vs code下powerline10k图形渲染异常
  11. 飞猪IP-代理-换IP作用
  12. 机器学习笔记之概率图模型(八)信念传播(Belief Propagation,BP)(基于树结构)
  13. Java的随机数原理
  14. python实现离职滤波_如何用Python预测员工离职率?
  15. 【网络Ping不通如何解决?】
  16. 中国文化产业基地(园区)前景预测和发展战略规划建议报告2021年版
  17. 最“丑”录取通知书,谁家院校上榜?新一波研究生通知书已送达
  18. oracle 11g 导入\导出(expdp impdp)详解之导入
  19. 数据模拟:利用Java模拟数据(姓名,邮箱,地址,电话等信息,时间,工资,1-10随机数)并存入mysql
  20. MATLAB文件操作

热门文章

  1. 腾讯免费企业邮箱服务器,怎样使用免费的腾讯企业邮箱
  2. socket 10053 错误之路
  3. 判断字符串是不是回文
  4. SaaS,PaaS和IaaS在一张图中进行了解释
  5. jquery 遍历集合
  6. 在Excel中创建彩色的Harvey球
  7. javascript笔记知识(可能有错误、欢迎指正)
  8. html网页打不开二级网页,二级网页打不开的解决方法
  9. C语言求三个数的中间值(三目运算符)
  10. Python笔记_20_魔术方法