题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1085

迭代加深搜索。

估价函数是为了预计步数来剪枝,所以要优于实际步数。

没错,不是为了确定搜索顺序,而是为了可行性剪枝!这样的话-1的情况就不会很慢了。

  这样的话估价函数也不能弄什么 每个不合法位置到最近合法位置的距离 或者 把这个距离/3当做步数 了呢……

总之估价函数弄成不合法位置的个数来表示预计步数是很好的。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int T,dist[][],kx,ky,lm,ans,pri;
int cz[][]={,,-,-,-,-,,-,,-,,,,,-,,-,};
char a[][];
bool flag;
int g0(int i,int j)
{
if(j<i||(i==&&j==)||(i==&&j==))return ;return ;
}
int g1(int i,int j)
{
if(j>i||(i==&&j==)||(i==&&j==))return ;return ;
}
int gx(int i,int j)
{
if(i==&&j==)return ;return ;
}
int g(int i,int j)
{
if(a[i][j]=='')return g0(i,j);if(a[i][j]=='')return g1(i,j);return gx(i,j);
}
void init()
{
pri=;//
for(int i=;i<=;i++)
for(int j=;j<=;j++)
{
pri+=g(i,j);if(a[i][j]=='*')kx=i,ky=j;
}
}
bool pd(int x,int y,int k)
{
if(x+cz[k][]<=&&x+cz[k][]>=&&y+cz[k][]<=&&y+cz[k][]>=)return true;
return false;
}
void dfs(int x,int y,int cnt,int base)
{
if(cnt==lm&&!base){flag=;ans=cnt;return;}
if(cnt>=lm)return;
for(int i=;i<=;i++) if(pd(x,y,i))
{
int tx=x+cz[i][],ty=y+cz[i][],val;
if(a[tx][ty]=='')val=base-g0(tx,ty)-gx(x,y)+g0(x,y)+gx(tx,ty);
else val=base-g1(tx,ty)-gx(x,y)+g1(x,y)+gx(tx,ty);
if(val+cnt<=lm)
{
a[x][y]=a[tx][ty];a[tx][ty]='*';
dfs(tx,ty,cnt+,val);
a[tx][ty]=a[x][y];a[x][y]='*';
if(flag)return;
}
}
}
int main()
{
scanf("%d",&T);
while(T--)
{
for(int i=;i<=;i++)scanf("%s",a[i]+);
init();flag=;
for(lm=;lm<=;lm++)
{
dfs(kx,ky,,pri);if(flag)break;
}
if(flag)printf("%d\n",ans);else printf("-1\n");
}
return ;
}

bzoj 1085 [SCOI2005]骑士精神——IDA*的更多相关文章

  1. [BZOJ 1085] [SCOI2005] 骑士精神 [ IDA* 搜索 ]

    题目链接 : BZOJ 1085 题目分析 : 本题中可能的状态会有 (2^24) * 25 种状态,需要使用优秀的搜索方式和一些优化技巧. 我使用的是 IDA* 搜索,从小到大枚举步数,每次 DFS ...

  2. bzoj 1085: [SCOI2005]骑士精神 IDA*

    题目链接 给一个图, 目标位置是确定的, 问你能否在15步之内达到目标位置. 因为只有15步, 所以直接ida* #include<bits/stdc++.h> using namespa ...

  3. Bzoj 1085: [SCOI2005]骑士精神 (dfs)

    Bzoj 1085: [SCOI2005]骑士精神 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1085 dfs + 剪枝. 剪枝方法: ...

  4. BZOJ 1085: [SCOI2005]骑士精神( IDDFS + A* )

    一开始写了个 BFS 然后就 T 了... 这道题是迭代加深搜索 + A* -------------------------------------------------------------- ...

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

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

  6. bzoj 1085: [SCOI2005]骑士精神

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

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

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1085 分析: 首先第一感觉是宽搜,但是空间需要8^15*5*5,明显不够,又鉴于最大深 ...

  8. BZOJ.1085.[SCOI2005]骑士精神(迭代加深搜索)

    题目链接 最小步数这类,适合用迭代加深搜索. 用空格走代替骑士. 搜索时记录上一步防止来回走. 不需要每次判断是否都在位置,可以计算出不在对应位置的骑士有多少个.而且每次复原一个骑士至少需要一步. 空 ...

  9. BZOJ 1085: [SCOI2005]骑士精神(A*算法)

    第一次写A*算法(这就是A*?如果这就是A*的话,那不就只是搜索的一个优化了= =,不过h函数如果弄难一点真的有些难设计) 其实就是判断t+h(x)(t为当前步数,h(x)为达到当前状态的最小步数) ...

随机推荐

  1. resultMap结果集映射

    resultMap结果集是用来定义sql查询的结果与java对象的映射关系.它主要解决2大问题: 1)可以解决POJO属性名和表结构的字段名不一致问题(甚至是 不是标准的驼峰命名法) 2)可以完成高级 ...

  2. linux 终端分屏命令

    比如:某文件夹下有文件:vector.cc, substr.cc 1.使用vim命令打开任意一个文件:vim vector.cc打开第一个文件.如下图所示: 2.按:"Esc"键 ...

  3. postman(谷歌) httprequester(火狐)

    http://www.cnblogs.com/s380774061/p/4624326.html @an http://www.tuicool.com/articles/67Rnaej 测试文档券栈 ...

  4. 基本sql查询语句练习

    Student(S#,Sname,Sage,Ssex) 学生表  Course(C#,Cname,T#) 课程表  SC(S#,C#,score) 成绩表  Teacher(T#,Tname) 教师表 ...

  5. xp_sp3_pro_简中_x86_cd_vl_x14-74070

    1.镜像文件: zh-hans_windows_xp_professional_with_service_pack_3_x86_cd_vl_x14-74070.iso 来自 msdn itellyou ...

  6. org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [bean.xml]: Invocation of init method failed; nested exception is

    在复制xml文件进行修改的时候,我经常将不小心对原文件进行修改,而导致创建bean出错.报错如下所示: Exception sending context initialized event to l ...

  7. android视图概述

    android视图概述 一.简介 数据和控件分开的作用: 便于引用 便于修改:修改的时候直接改一次数据就可以了

  8. activity启动模式之singleTop

    activity启动模式之singleTop 一.简介 二.设置方法 在AndroidManifest.xml中将要设置为singleTop启动模式的页面进行配置 <activity andro ...

  9. 5.6 WebDriver API实例讲解(41-50)

    41.操作Web页面的滚动条 (1)滑动页面的滚动条到页面的最下面. (2)滑动页面的滚动条到页面的某个元素. (3)滑动页面的滚动条向下移动某个数量的像素. package apiSample; i ...

  10. C++(二十一) — 引用概念及本质

     1.引用概念 引用是别名,必须在声明的时候初始化.即:是指一个已定义变量的别名.(一个内存空间,有两个名字都可以操作) 引用:在函数调用时,是变量的别名,不可以单独存在,使用时必须要初始化: 指针: ...