【SCOI 2005】骑士精神
【题目】
传送门
题目描述:
在一个 5×55×55×5 的棋盘上有 121212 个白色的骑士和 121212 个黑色的骑士, 且有一个空位。在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为 111 ,纵坐标相差为 222 或者横坐标相差为 222 ,纵坐标相差为 111 的格子)移动到空位上。
给定一个初始的棋盘,怎样才能经过移动变成如下目标棋盘:
为了体现出骑士精神,他们必须以最少的步数完成任务。
输入格式:
第一行有一个正整数 ttt(ttt ≤ 101010),表示一共有 ttt 组数据。
接下来有 ttt 个 5×55×55×5 的矩阵,000 表示白色骑士,111 表示黑色骑士,∗*∗ 表示空位。两组数据之间没有空行。
输出格式:
对于每组数据都输出一行。如果能在 151515 步以内(包括 151515 步)到达目标状态,则输出步数,否则输出 −1-1−1 。
样例数据:
输入
2
10110
01*11
10111
01001
00000
01011
110*1
01110
01010
00100
输出
7
-1
备注:
【样例说明】
样例中第二个数据的初始情况对应该图:
【分析】
题解:IDA*(我觉得就是迭代加深和 A* 的结合)
看到数据范围最多移动 151515 次,很容易想到搜索,但爆搜显然是不行的,要想办法优化,于是想到这几个搜索优化
首先是由于最多走 151515 步,很容易想到迭代加深,不断加大深度来判断当前的深度是否合法
然后就是用 A* 优化,这道题的估价函数是很好写的,由于每次移动最多使一个骑士到位,所以统计一下当前没有到位的骑士就是估计值了
直接用骑士来 dfsdfsdfs 不太好做,我们就想到用空格的移动来 dfsdfsdfs(因为每次移动空格的位置都会变)
【代码】
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int h,flag,a[10][10];
int tx[10]={0,1,1,2,2,-2,-2,-1,-1};
int ty[10]={0,2,-2,1,-1,1,-1,2,-2};
int goal[7][7]={{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 eva()
{int i,j,num=0;for(i=1;i<=5;++i)for(j=1;j<=5;++j)if(a[i][j]!=goal[i][j])num++;return num;
}
void A_star(int x,int y,int dep)
{if(dep==h){if(!eva())flag=true;return;}int i,xx,yy;for(i=1;i<=8;++i){xx=x+tx[i];yy=y+ty[i];if(xx>=1&&xx<=5&&yy>=1&&yy<=5){swap(a[x][y],a[xx][yy]);if(eva()+dep<=h)A_star(xx,yy,dep+1);swap(a[x][y],a[xx][yy]);}}
}
int main()
{char c;int n,i,j,sx,sy;scanf("%d",&n);while(n--){for(i=1;i<=5;++i){for(j=1;j<=5;++j){cin>>c;a[i][j]=c-'0';if(c=='*') a[i][j]=2,sx=i,sy=j;}}if(!eva()) {printf("0\n");continue;}flag=0;for(h=1;h<=15;++h){A_star(sx,sy,0);if(flag) {printf("%d\n",h);goto end;}}printf("-1\n");end:;}return 0;
}
【SCOI 2005】骑士精神相关推荐
- [luogu 2324][SCOI 2005] 骑士精神 (A*算法)
Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2, ...
- 【BZOJ1085】【SCOI2005】骑士精神 [A*搜索]
骑士精神 Time Limit: 10 Sec Memory Limit: 162 MB [Submit][Status][Discuss] Description 在一个5×5的棋盘上有12个白色 ...
- [启发式搜索/A*] [SCOI2005]骑士精神题解
洛谷-骑士精神 启发式搜索-A* 估价函数 对于当前状态,我们可以将其与目标状态对比,得到一个预估的代价,即最少(不一定满足题意)的代价,得到这个代价的函数叫做估价函数 对于一个最短路问题来说,我们可 ...
- 『骑士精神 IDA*』
骑士精神(SCOI2005) Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑 士的走法(它可以走到和它横坐标相差为1,纵 ...
- BZOJ1085 [SCOI2005] 骑士精神
[问题描述] 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑 士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2,纵坐标相 ...
- 洛谷 P2324 [SCOI2005]骑士精神 解题报告
P2324 [SCOI2005]骑士精神 题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,* ...
- BZOJ 1085 [SCOI2005]骑士精神 【A*启发式搜索】
1085: [SCOI2005]骑士精神 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2838 Solved: 1663 [Submit][St ...
- 埃及分数The Rotation Game骑士精神——IDA*
IDA*:非常好用的搜索,可以解决很多深度浅,但是规模大的搜索问题. 估价函数设计思路:观察一步最多能向答案靠近多少. 埃及分数 题目大意: 给出一个分数,由分子a 和分母b 构成,现在要你分解成一系 ...
- bzoj1085骑士精神(搜索)
1085: [SCOI2005]骑士精神 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 1893 Solved: 1051 Description ...
最新文章
- torch中tensor的普通索引以及index_select()
- vue请求在退出页面还执行吗_如何用 Cloudbase Framework 部署一个 Vue 项目
- Tensorflow2.x.x全卷积神经网络(CNN)
- 你以为文言编程只是闹着玩?三个月后,人家IDE、教程、包管理器都有了
- html div画三角,css画三角形
- airflow使用_使用AirFlow,SAS Viya和Docker像Pro一样自动化ML模型
- 数字前端工程师必备技能
- Bootstrap CSS 编码规范之单行规则声明
- opencv 轮廓 缺陷检测
- 为中国本土NGINX用户和开发者提供技能升级的考试认证平台
- docker技术之基本命令
- js执行函数报错Cannot set property 'value' of null
- 【雷达测角】基于matlab和差波束加权【含Matlab源码 1674期】
- (亲测有效).net framework 在计算机上已安装了更高的 4.x 版本,则无法安装以前的 4.5 版本。
- UCan技术开放日|告别转型“焦虑”,从云原生开始
- 看网易云公开课代码性能开发有感,怎样提高代码的性能
- Mybatis之xml方式(一)
- 《Context Contrasted Feature and Gated Multi-Scale Aggregation for Scene Segmentation》论文阅读
- 2016京东校园招聘在线笔试回忆版
- Github即将破百万的PDF:编写高质量代码改善JAVA程序的151个建议
热门文章
- matlab abc dq,关于matlab及pscad中abc2dq模块的使用.doc
- 不要忘了我们心中的梦
- 软件的生命周期和测试的生命周期的区分
- springBoot二维码生成案例
- 关于windows11安装vc6.0闪退解决问题
- Kotlin+Retrofit + MVVM 的网络请求框架的封装
- C语言中void的错误用法
- Flutter ShowModalBottomSheet 自定义高度和滚动
- 复位的recovery time和removal time
- SpringBoot(SpringMVC)文件上传下载