题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1813

思路:首先bfs预处理出‘0’到边界点最短距离,然后构造 h() 为所’0‘点逃离迷宫的最少步数的最大值。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
#define inf 1<<30
typedef pair<int,int>PP; struct Node{
int x,y;
}node[]; char str[][];
int map[][],Index[],dist[][];
int n,m,maxdeep;
int dir[][]={{,},{-,},{,},{,-}}; bool In_Edge(int x,int y)
{
if(x==||x==n||y==||y==n)return true;
return false;
} int bfs(int x,int y)
{
queue<PP>que;
que.push(make_pair(x,y));
int dd[][];
memset(dd,-,sizeof(dd));
dd[x][y]=;
while(!que.empty()){
x=que.front().first,y=que.front().second;
que.pop();
if(In_Edge(x,y))return dd[x][y];
for(int i=;i<;i++){
int xx=x+dir[i][],yy=y+dir[i][];
if(map[xx][yy]&&dd[xx][yy]==-){
dd[xx][yy]=dd[x][y]+;
que.push(make_pair(xx,yy));
}
}
}
return -;
} int Get_H(Node node[])
{
int max_dist=;
for(int i=;i<m;i++){
max_dist=max(max_dist,dist[node[i].x][node[i].y]);
}
return max_dist;
} bool IDA_star(int deep,Node node[])
{
if(Get_H(node)+deep>maxdeep)return false;
if(deep==maxdeep)return true; Node tmp_node[];
for(int i=;i<;i++){
Index[deep]=i;
for(int j=;j<m;j++){
int xx=node[j].x+dir[i][],yy=node[j].y+dir[i][];
if(In_Edge(node[j].x,node[j].y)||map[xx][yy]==){
tmp_node[j]=node[j];
}else
tmp_node[j].x=xx,tmp_node[j].y=yy;
}
if(IDA_star(deep+,tmp_node))return true;
}
return false;
} int main()
{
int t=;
while(~scanf("%d",&n)){
if(t++)puts("");
for(int i=;i<=n;i++){
scanf("%s",str[i]+);
for(int j=;j<=n;j++)map[i][j]=-(str[i][j]-'');
}
m=;
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
if(map[i][j]){
if(In_Edge(i,j))dist[i][j]=;
else {
dist[i][j]=bfs(i,j);
node[m].x=i,node[m++].y=j;
}
}else
dist[i][j]=inf;
}
}
if(m==)continue;
for(maxdeep=; ;maxdeep++){
if(IDA_star(,node))break;
}
for(int i=;i<maxdeep;i++){
if(Index[i]==)puts("east");
else if(Index[i]==)puts("north");
else if(Index[i]==)puts("south");
else if(Index[i]==)puts("west");
}
}
return ;
}

hdu 1813(IDA*)的更多相关文章

  1. HDU 1813 Escape from Tetris (IDA*)

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1813 题意:给你一个n*n的迷宫,其中0代表有一个人在这个位置,1代表墙,现在要求一个路线,使所有的人通 ...

  2. hdu 2234(IDA*)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2234 思路:IDA*可以搞,借鉴的是大牛的启发式函数h(): 可以考虑把每一行上的数转化成相同的,或者 ...

  3. hdu 1667(IDA*)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1667 思路:大牛说是IDA*的入门题=.=构造h()=8-max(1,2,3);  max(1,2,3 ...

  4. HDU 1813 Escape from Tetris

    TMDTMD IDA*没跑了.什么是IDA*? 就是迭代深搜+A*估个价. 然而为什么调了一天? n<=2的时候我输出了东西.... 看了一天. #include<iostream> ...

  5. HDU - 1584 IDA*

    思路:裸的IDA*,估计当前状态至少需要多少距离才能达到目标状态,剪枝即可.每一墩牌只需记录其最上面和最下面的牌型即可完成移动. AC代码 #include <cstdio> #inclu ...

  6. HDU - 3567 IDA* + 曼哈顿距离 + 康托 [kuangbin带你飞]专题二

    这题难度颇大啊,TLE一天了,测试数据组数太多了.双向广度优先搜索不能得到字典序最小的,一直WA. 思路:利用IDA*算法,当前状态到达目标状态的可能最小步数就是曼哈顿距离,用于搜索中的剪枝.下次搜索 ...

  7. hdu 2918(IDA*)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2918 思路:这道题与前面几道类似,可以说是被秒杀了!!!构造启发式函数h()=(cnt+3)/4(cn ...

  8. hdu 1560(IDA*)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1560 思路:关键是启发式函数h()的构造,我们可以这样想:每次给主串增加一个字符和字符串的最后一位比较 ...

  9. HDU 1560 IDA*搜索

    用N个串中找到最短的公共串(不要求连续,仅仅要相对位置一样就可以) 迭代加深搜索就可以 剪枝:当前的深度+最少还有加深的深度是否大于限制的长度,若是,则退回. #include "stdio ...

随机推荐

  1. Ruby 和 Python 分析器是如何工作的?

    你好! 我作为一名编写Ruby profiler的先驱,我想对现有的Ruby和Python profiler如何工作进行一次调查. 这也有助于回答很多人的问题:“你怎么写一个profiler?” 在这 ...

  2. EMQ配置

    参考官方配置页面:http://emqtt.com/docs/v2/tune.html Linux 操作系统参数系统所有进程可打开的文件数量官方配置: sysctl -w fs.file-max=20 ...

  3. Python 爬虫实例(6)—— 爬取蚂蚁免费代理

    数据库表sql语句: CREATE TABLE `free_ip` ( `free_ip_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键', `ip` ...

  4. java递归算法实现拼装树形JSON数据

    有时候页面需要使用jQuery easy ui中的combotree,需要给combotree提供一个JSON数据,使用如下方法(递归)实现(下面是dao层的实现层): /** * 根据表名和父id拼 ...

  5. python--迭代器的实现

    #!/usr/local/python/bin/python3 """ 一个迭代器的例子 """ class exsample(object ...

  6. Linux更改Apache网站目录出错:Document root must be a directory解决

    Linux更改Apache网站目录出错:Document root must be a directory解决   修改   DocumentRoot     <Directory " ...

  7. [Jobdu] 题目1408:吃豆机器人

    题目描述: 淘宝公司内部有许多新鲜的小玩具,例如淘宝智能机器人.小时候,大家都玩过那个吃豆子的游戏吧,这机器人就是按照这个游戏设计的,它会朝着豆子的方向行走.不过机器人还存在一个bug,他只会朝南和朝 ...

  8. Atitit.数据库事务隔离级别 attilax 总结

    Atitit.数据库事务隔离级别 1. 事务隔离级别的作用 1 2. 在的隔离级别 2 3. 常见数据库的默认管理级别 3 1. 事务隔离级别的作用 较低的隔离级别可以增强许多用户同时访问数据的能力, ...

  9. 揭开Altera公司支持OpenCL的设计工具的神秘面纱

    将程序中处理负荷较大的工作分配给加速器LSI的“异构计算(Heterogeneous Computing)”将踏出崭新的一步.美国Altera公司将于2013年内开始面向普通用户提供可自动由按照异构计 ...

  10. JAVA类加载器概念与线程类加载器

    类加载器的功能:通过一个类的全限定名来获取描述此类的二进制字节流的过程 java的类加载器大致可以分为两类,一类是系统提供的,一类是由应用开发人员编写的.系统提供的类加载器有以下三种: 引导类加载器( ...