题意:给你k种管道,然后是每种的长度,每种的数量,求(x1,y1)到(x2,y2)所用管道的最少数量

思路:

最开始考虑的是直接bfs,但是没有成功。

然后发现可以先找x轴x1 到 x2 ,再找y轴y1 到 y2。两个的和便是最终答案。

先用bfs处理出两条轴上的估计函数(即每个地方到x2或y2的距离),然后枚举深度搜索。

Orz;

1.最开始思路的方向就错了,没想到可以x,y轴分开来考虑- -,果然脑子转不过来

2.而且最后忘了判断是否有答案,贡献了个TL

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <queue>
#include <algorithm>
typedef long long ll;
using namespace std; int len[5];
int num[5];
int have1[1005];
int have2[1005];
int x1,x2,y2,y1,k; void bfs(int *a,int to) //估价函数,到to的最小步数
{
queue<int >q;
q.push(to);
a[to] = 0;
while(!q.empty())
{
int cur = q.front();
q.pop(); for(int i = 0; i < k; i++)
{
if(cur-len[i] > 0 && a[cur-len[i]] == -1)
{
a[cur-len[i]] = a[cur] + 1;
q.push(cur-len[i]);
} if(cur+len[i]<= 1000 && a[cur+len[i]] == -1)
{
a[cur+len[i]] = a[cur]+1;
q.push(cur+len[i]);
}
}
}
} bool IDA(int cur,int now,int ci,int flag)
{
if(!flag)
{
if(cur + have1[now] > ci)
return false;
if(now == x2) //当x轴已经达到目标点x2,去搜索y轴
{
if(IDA(0,y1,ci-cur,1))
return true;
}
} if(flag)
{
if(cur+have2[now] > ci)
return false;
if(now == y2) //y轴到达y2点
return true;
} for(int i = 0; i < k; i++)
{
if(num[i] > 0) //还能添加i
{
num[i]--;
if(flag == 0)
{
if(now + len[i] <= 1000) if(IDA(cur+1,now+len[i],ci,flag)) return true;
if(now - len[i] > 0) if(IDA(cur+1,now-len[i],ci,flag)) return true;
}
else
{
if(now + len[i] <= 1000) if(IDA(cur+1,now+len[i],ci,flag)) return true;
if(now - len[i] > 0) if(IDA(cur+1,now-len[i],ci,flag)) return true;
}
num[i]++;
}
}
return false;
} int main()
{
while(scanf("%d%d%d%d",&x1,&y1,&x2,&y2) != EOF)
{
int tmax = 0,ans;
scanf("%d",&k);
for(int i = 0; i < k; i++)
scanf("%d",len+i); for(int i = 0; i < k; i++)
{
scanf("%d",num+i);
tmax += num[i];
}
if(x1 == x2 && y1 == y2)
{
printf("0\n");
continue;
} memset(have1,-1,sizeof(have1));
memset(have2,-1,sizeof(have2));
bfs(have1,x2);
bfs(have2,y2);
for(int i = 0;; i++)
{
if(IDA(0,x1,i,0))
{
ans = i;
break;
}
if(i > tmax){ //找不到答案
ans = 10000;
break;
}
}
if(ans <= tmax)
printf("%d\n",ans);
else
printf("-1\n");
}
return 0;
}

  

poj2331 (IDA*)的更多相关文章

  1. Booksort POJ - 3460 (IDA*)

    Description The Leiden University Library has millions of books. When a student wants to borrow a ce ...

  2. UVA - 10384 The Wall Pusher(推门游戏)(IDA*)

    题意:从起点出发,可向东南西北4个方向走,如果前面没有墙则可走:如果前面只有一堵墙,则可将墙向前推一格,其余情况不可推动,且不能推动游戏区域边界上的墙.问走出迷宫的最少步数,输出任意一个移动序列. 分 ...

  3. 人类即将进入互联网梦境时代(IDA)

    在电影<盗梦空间>中,男主角科布和妻子在梦境中生活了50年,从楼宇.商铺.到河流浅滩.一草一木.这两位造梦师用意念建造了属于自己的梦境空间.你或许并不会想到,在不久未来,这看似科幻的情节将 ...

  4. POJ2286 The Rotation Game(IDA*)

    The Rotation Game Time Limit: 15000MS   Memory Limit: 150000K Total Submissions: 5691   Accepted: 19 ...

  5. UVA-10384 The Wall Pushers (IDA*)

    题目大意:走迷宫,遇到墙时可以推着墙走,但墙后还是墙时便不能推.求出一条任意的最短路径. 题目分析:这道题出的比较人性,输入的时候便是将四周的墙用二进制数表示好了,其实这样减轻了做题人的负担.IDA* ...

  6. POJ - 2286 - The Rotation Game (IDA*)

    IDA*算法,即迭代加深的A*算法.实际上就是迭代加深+DFS+估价函数 题目传送:The Rotation Game AC代码: #include <map> #include < ...

  7. 骑士精神(IDA*)

    题目描述 输入格式 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,*表示空位.两组数据之间没有空行. 输出格式 对于每组数据都 ...

  8. BZOJ 1085(IDA*)

    题面 传送门 分析 首先,直接搜索肯定会TLE 很容易想到用迭代加深的方法,限定搜索深度 但是,这样仍然不够,需要用启发式的方法优化 我们设计一个估价函数f(x)=g(x)+h(x)f(x)=g(x) ...

  9. 【wikioi】2495 水叮当的舞步(IDA*)

    http://wikioi.com/problem/2495/ 这题我还是看题解啊囧.(搜索实在太弱.完全没想到A*,还有看题的时候想错了,.,- -) 好吧,估价还是那么的简单,判断颜色不同的数目即 ...

随机推荐

  1. AWK读书笔记

    1.awk 'parttern {action}' filename 从文件中逐行读取并匹配parttern,若匹配成功执行action否则读取下一行. parttern和action都可选,若省略p ...

  2. 【学习笔记】windows安装jhipster踏坑记录

    序: 入职新公司第二天了,本来第一天是配置环境来着,配了一下午也没搞成那个jhipster的安装,每次以为应该正常的时候都是不对,yo是yeoman的指令,但是我是使用yarn管理的yeoman 纠结 ...

  3. OpenShift实战(一):OpenShift高级安装

    1.1 服务器基本信息 本次安装采用一个master.5个node.3个etcd,node节点两块硬盘,60G磁盘用于docker storage,xxx改为自己的域名或主机名. 节点 功能 IP 内 ...

  4. java 1.7新特性

    try( ... ){ ... } catch(xxx e){ ... } java1.7特性,叫做try-with-resource,实现了AutoCloseable接口的实例可以放在try(... ...

  5. OO第一次阶段性总结

    经过三次作业的历练之后终于来到了写博客这一周.回顾开学来的这一个月,令我印象最深刻也是最累的一门课就是OO了.虽然上学期学过一部分Java,但这学期开学就来的OO作业还是让我在第二周就开始熬夜了.不过 ...

  6. Postgres中postmaster代码解析(上)

    之前我的一些文章都是在说Postgres的一些查询相关的代码.但是对于Postgres服务端是如何启动,后台进程是如何加载,服务端在哪里以及如何监听客户端的连接都没有一个清晰的逻辑.那么今天我来说说P ...

  7. 由路由器AP隔离引起的WEB服务不能访问的问题

    最近在自己的电脑上运行了一个Web服务,发现它只能被本机访问,无法在同一个局域网的其它设备访问. 于是在网上搜索了各种资料,通通都是在操作系统层面来分析解决问题的. 而我怎么尝试都不成功的情况下,差点 ...

  8. Python入门之三元表达式\列表推导式\生成器表达式\递归匿名函数\内置函数

    本章目录: 一.三元表达式.列表推导式.生成器表达式 二.递归调用和二分法 三.匿名函数 四.内置函数 ================================================ ...

  9. CWMP开源代码研究番外篇——博通方案

    声明:本篇文章来自于某公司Cable Modem产品的文档资料,源码来自于博通公司,只提供参考(为保护产权,本人没有源码). 前文曾提到会写一篇关于博通的tr069,那么福利来了.福利,福利,福利,重 ...

  10. Hadoop MR编程

    Hadoop开发job需要定一个Map/Reduce/Job(启动MR job,并传入参数信息),以下代码示例实现的功能: 1)将一个用逗号分割的文件,替换为“|”分割的文件: 2)对小文件合并,将文 ...