题目: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. Intellij IDEA生成serialVersionUID

    默认情况下Intellij IDEA不会提示继承了Serializable接口的类生成serialVersionUID的警告.如果需要生成serialVersionUID,就要在Preferences ...

  2. [转载]织梦DEDE多选项筛选_联动筛选功能的实现_二次开发

    织梦默认的列表页没有筛选功能,但有时候我们做产品列表页的时候,产品的字段比较多,很多人都需要用到筛选功能,这样可以让用户更方便的找到自己所需要的东西,实现这个联动筛选功能需要对织梦进行二次开发,下面就 ...

  3. 子tab里面新增tab(top.jQuery)

    top.jQuery应用. var jq = top.jQuery; if (jq("#centre").tabs("exists", "预览页面&q ...

  4. oracle数据库插入优化

    通过程序要把1000万的数据插入到数据表中,刚开始每100条数据耗时50ms左右,但是越往后越慢,最慢到了十几秒的都有,真实好坑了. 于是在网上百度了一波,如何进行insert优化.倒是有了一点小小的 ...

  5. LeetCode第[17]题(Java):Letter Combinations of a Phone Number

    题目:最长公共前缀 难度:EASY 题目内容: Given a string containing digits from 2-9 inclusive, return all possible let ...

  6. 编辑器上的vim插件,常用到的快捷件

    [vim]常用到的插件命令 [Esc] 退出编辑(输入,插入)模式,回到命令模式中(常用)i, I进入插入模式(Insert mode):i 为『从目前光标所在处插入』, I 为『在目前所在行的第一个 ...

  7. VirtualizingPanel.IsVirtualizing 附加属性

    VirtualizingPanel.IsVirtualizing 附加属性 获取或设置一个值,该值指示此 VirtualizingPanel 正在虚拟化其子集合. 说明: 标准布局系统可以创建项容器并 ...

  8. 分享知识-快乐自己:Ajax 跨域请求处理

    <%-- Created by IntelliJ IDEA. User: asus Date: 2019/1/24 Time: 15:57 To change this template use ...

  9. Appium 自动化测试(4)-- 脚本开发:官方demo演示 android_contacts.py

    前提:根据前面的环境搭建介绍,安装好相关环境 step1:启动android模拟器 step2:启动Appium服务端 step3:演示代码执行 这里执行的是官方的演示代码:通讯录管理app,安装打开 ...

  10. poj2478欧拉函数

    打表欧拉函数,求2到n的欧拉函数和 #include<map> #include<set> #include<cmath> #include<queue> ...