迭代加深搜索 C++解题报告 :[SCOI2005]骑士精神

题目
此题根据题目可知是迭代加深搜索。
首先应该枚举空格的位置,让空格像一个马一样移动。
但迭代加深搜索之后时间复杂度还是非常的高,根本过不了题。
感觉也想不出什么减枝,于是便要用到了乐观估计函数(Optimistic Estimation Function)
以3种颜色的格子来表示原棋盘:
如果我们要从一个状态抵达到原棋盘,那么需要的步数绝对是小于当前状态与原棋盘不同的格子的数量、
那么我们的乐观估计函数就出来了。如果当前状态与原棋盘的不同格子数量小于我们的剩余的步数,那么肯定是抵达不了的,return回去就行。
代码
#include <iostream>
#include <cstring>
using namespace std;
#define N 510
int dir[8][2]={{2,1},{2,-1},{-2,1},{-2,-1},{1,2},{1,-2},{-1,-2},{-1,2}};
int fuck[10][10]={{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}};
int a[10][10],T,px,py,len,flag=0;
int dif() {
int sum=0;
for(int i=1;i<=5;i++) for(int j=1;j<=5;j++)
if(a[i][j] != fuck[i][j])
sum++;
return sum;
}
void dfs(int step) {
if(step>len) {
if(dif()==0) flag=1;
return ;
}
if(dif()>len-step+2) return ;
for(int k=0;k<8;k++) {
int tx=px+dir[k][0],ty=py+dir[k][1];
if( tx<1 || tx>5 || ty<1 || ty>5) continue;
swap(a[tx][ty],a[px][py]);
swap(px,tx);
swap(py,ty);
dfs(step+1);
swap(a[tx][ty],a[px][py]);
swap(px,tx);
swap(py,ty);
}
}
int main() {
cin>>T;
while(T--) {
flag=0;
memset(a,0,sizeof(a));
for(int i=1;i<=5;i++) for(int j=1;j<=5;j++) {
char l;
cin>>l;
if(l=='1') a[i][j]=1;
else if(l=='0') a[i][j]=0;
else a[i][j]=2,px=i,py=j;
}
for(len=0;len<=15;len++) {
dfs(1);
if(flag) {
cout<<len<<endl;
break;
}
}
if(!flag)
cout<<-1<<endl;
}
}
在我的程序里有这一句:
if(dif()>len-step+2) return ;
因为有这种特例,保险起见,多加一个1。

迭代加深搜索 C++解题报告 :[SCOI2005]骑士精神的更多相关文章
- BZOJ1085: [SCOI2005]骑士精神 [迭代加深搜索 IDA*]
1085: [SCOI2005]骑士精神 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1800 Solved: 984[Submit][Statu ...
- BZOJ.1085.[SCOI2005]骑士精神(迭代加深搜索)
题目链接 最小步数这类,适合用迭代加深搜索. 用空格走代替骑士. 搜索时记录上一步防止来回走. 不需要每次判断是否都在位置,可以计算出不在对应位置的骑士有多少个.而且每次复原一个骑士至少需要一步. 空 ...
- 【bzoj1085】【 [SCOI2005]骑士精神】启发式剪枝+迭代加深搜索
(上不了p站我要死了,侵权度娘背锅) 如果这就是启发式搜索的话,那启发式搜索也不是什么高级玩意嘛..(啪啪打脸) Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且 ...
- C++解题报告 : 迭代加深搜索之 ZOJ 1937 Addition Chains
此题不难,主要思路便是IDDFS(迭代加深搜索),关键在于优化. 一个IDDFS的简单介绍,没有了解的同学可以看看: https://www.cnblogs.com/MisakaMKT/article ...
- BZOJ1085 SCOI2005 骑士精神【IDA* 启发式迭代加深】
BZOJ1085 SCOI2005 骑士精神 Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐 ...
- BZOJ 1085 骑士精神 迭代加深搜索+A*
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1085 题目大意: 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个 ...
- 洛谷 P2324 [SCOI2005]骑士精神 解题报告
P2324 [SCOI2005]骑士精神 题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,* ...
- 算法复习——迭代加深搜索(骑士精神bzoj1085)
题目: Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相 ...
- UVA 529 - Addition Chains,迭代加深搜索+剪枝
Description An addition chain for n is an integer sequence with the following four properties: a0 = ...
随机推荐
- Axis2 服务器端抛出ServiceClass object does not implement问题解决方法
在用eclipse配合Axis2进行开发的时候,编译通过,启动tomcat也顺利,但是就是在调用服务器端的服务时,会抛出: The ServiceClass object does not imple ...
- ruby在index页面显示货币符号
1.显示人民币符号 <td><%= number_to_currency product.price, unit: "¥" %></td> 2. ...
- chrome浏览器和其它浏览器对scrollTop、scrollLeft的获取方法
chrome浏览器不能通过document.documentElement.scrollTop来获得距上滚动距离,得到的值始终为0:需要用document.body.scrollTop来获取.其它浏览 ...
- 在Maven中新增自定的jar包
引言: 在软件项目中,Maven提供了一体化的类库管理系统,非常实用.但是,如果新增的类库jar在网络上无法获取到,如何在本地按照Maven的规则添加进来呢?本文将通过一个小例子展示新增过程. 背景介 ...
- 【深入Java虚拟机(1)】:Java内存区域与内存溢出
原文出处: 兰亭风雨 内存区域 Java虚拟机在执行Java程序的过程中会把他所管理的内存划分为若干个不同的数据区域.Java虚拟机规范将JVM所管理的内存分为以下几个运行时数据区:程序计数器.Jav ...
- oracle数据库查询语句case的用法
实现功能: 1.先查询status=2的记录,如果查询到记录则返回第一条记录的Product_Name:2.如果查询不到status=2的记录,则判断status=1的记录是否存在,不存在则返回“请耐 ...
- LVS(一):基本概念和三种模式
网站架构中,负载均衡技术是实现网站架构伸缩性的主要手段之一.所谓"伸缩性",是指可以不断向集群中添加新的服务器来提升性能.缓解不断增加的并发用户访问压力. 负载均衡有好几种方式:h ...
- 网站JS控制的QQ悬浮
这是一个网站JS控制的QQ悬浮客服:代码1document.writeln("<div id=\"feedback\"><div id=\"f ...
- Ubuntu---gcc && g++
摘要:今天用 gcc 编译 c++ 代码,发现会报错:std::cout 这个函数无定义,所以决定查一下原因,在这里总结一下,虽然以后回头看一定会觉得太菜,但是新手期还是总要经历的一个阶段,所以就记 ...
- mysql concat筛选查询重复数据
SELECT * from (SELECT *,concat(field0,field1)as c from tableName) tt GROUP BY c HAVING count(c) > ...