题目链接: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. JDBC 关于大文本数据

    大文本数据Clob,在不同的数据库中类型名不一致,有的是text格式,有的是clob,还有其他一些格式   package test; import java.io.BufferedReader; i ...

  2. 卡特兰数(Catalan数)

    首先奉上高中的排列组合公式,防止某些人忘记了 卡特兰数: 规定h(0)=1,而h(1)=1,h(2)=2,h(3)=5,h(4)=14,h(5)=42,h(6)=132,h(7)=C(14,7)-C( ...

  3. http跨域访问

    if (Request.Headers.Get("Origin") != null) { filterContext.HttpContext.Response.AddHeader( ...

  4. DataGridView添加右键菜单等技巧

    1). 添加一个快捷菜单contextMenuStrip1:2). 给dataGridView1的CellMouseDown事件添加处理程序:  程序代码 private void DataGridV ...

  5. iOS_5_汤姆猫

    终于效果图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill ...

  6. js in

    定义: in操作符用来判断某个属性属于某个对象,可以是对象的直接属性,也可以是通过prototype继承的属性.(参见hasOwnProperty) 注意事项: n         对于一般的对象属性 ...

  7. Python中import和from import

    Python里面的import和from import都是用于导入一个模块,两者的区别是 如果你在使用某模块内函数时不想写模块名,那么就用from import方式导入,如果是用import方式就要写 ...

  8. OpenERP Framework API存档

    一. openerp.Widget 方法列表 init:function(parent) destroy:function() appendTo:function(target) prependTo: ...

  9. Linux下HTTP Server

    想在Linux下实现一个简单的web Server并不难.一个最简单的HTTP Server不过是一个高级的文件服务器,不断地接收客户端(浏览器)发送的HTTP请求,解析请求,处理请求,然后像客户端回 ...

  10. VS中C#读取app.config数据库配置字符串的三种方法(转)

    关于VS2008或VS2005中数据库配置字符串的三种取法 VS2008建立Form程序时,如果添加数据源会在配置文件 app.config中自动写入连接字符串,这个字符串将会在你利用DataSet, ...