题目链接: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. Maven--要点笔记

    --maven笔记 1.maven命令 2.archetype插件:用于创建符合maven规定的文件夹骨架   命令: mvn archetype:generate 3. 坐标:构件 仓库: 本地仓库 ...

  2. SQL 横转竖 、竖专横 (转载) 使用Dapper.Contrib 开发.net core程序,兼容多种数据库 C# 读取PDF多级书签 Json.net日期格式化设置 ASPNET 下载共享文件 ASPNET 文件批量下载 递归,循环,尾递归 利用IDisposable接口构建包含非托管资源对象 《.NET 进阶指南》读书笔记2------定义不可改变类型

    SQL 横转竖 .竖专横 (转载)   普通行列转换 问题:假设有张学生成绩表(tb)如下: 姓名 课程 分数 张三 语文 74 张三 数学 83 张三 物理 93 李四 语文 74 李四 数学 84 ...

  3. 缺省模板参数(借助标准模板容器实现Stack模板)、成员模板、关键字typename

    一.缺省模板参数 回顾前面的文章,都是自己管理stack的内存,无论是链栈还是数组栈,能否借助标准模板容器管理呢?答案是肯定的,只需要多传一个模板参数即可,而且模板参数还可以是缺省的,如下: temp ...

  4. /usr/lib64改名字风波

    注:本文描述请勿模仿,仅限万一遇到这种情况一试. 一不小心做了一个操作: cd /usr mv lib64 lib64-bak 然后奇异的发现: cp不能用了!ls也不能用了…… 提示信息如下: -b ...

  5. Centos7 通过yum源安装nginx

    通过rpm 添加yum源 rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ng ...

  6. Introduction to SIFT (Scale-Invariant Feature Transform)

    SIFT OpenCV 官方文档: https://docs.opencv.org/master/da/df5/tutorial_py_sift_intro.html https://opencv-p ...

  7. mysql ANSI_QUOTES 这个sql_mode的作用

    首先sql_mode用于mysql的行为,sql_mode的多个值之间用','分隔: 1.平时sql_mode的值是多少? select @@session.sql_mode; +---------- ...

  8. Oracle宣布很多其它的Java 9 新特性

    随着Oracle确认了其余的4个Java 9特性,下一代Java的计划開始变得更清晰了,Oracle已经发布了第二套Java 9特性.自从Oracle在今年早些时候宣布了3个新的API和模块化源代码后 ...

  9. 线程相关函数(3)-pthread_detach()将某个线程设成分离态

    #include <pthread.h>int pthread_detach(pthread_t tid); pthread_t tid: 分离线程的tid返回值:成功返回0,失败返回错误 ...

  10. shell脚本之函数的使用

    把代码封装成函数,相当于造了一个“轮子”,之后就直接重复使用即可. 函数的创建 shell中函数的创建有2种方式 1.使用function关键字 语法 function test { ... } 2. ...