题意:给你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. 20145237 《Java程序设计》第七周学习总结

    20145237 <Java程序设计>第七周学习总结 教材学习内容总结 第十三章   一.认识时间与日期   1.时间的度量   在正式认识Java提供了哪些时间处理API之前,得先来了解 ...

  2. Vue filter介绍及详细使用

    Vue filter介绍及其使用 VueJs 提供了强大的过滤器API,能够对数据进行各种过滤处理,返回需要的结果. Vue.js自带了一些默认过滤器例如: capitalize 首字母大写 uppe ...

  3. Comet之SSE(Server - Sent - Envent,服务器发送事件)

    1.SSE API 先要创建一个新的EventSource对象,并传进一个入口点: var source = new EventSource("myenvent.php"); △: ...

  4. csrf学习笔记

    CSRF全称Cross Site Request Forgery,即跨站点请求伪造.我们知道,攻击时常常伴随着各种各样的请求,而攻击的发生也是由各种请求造成的. CSRF攻击能够达到的目的是使受害者发 ...

  5. django models的点查询/跨表查询/双下划线查询

    django models 在日常的编程中,我们需要建立数据库模型 而往往会用到表与表之间的关系,这就比单表取数据要复杂一些 在多表之间发生关系的情形下,我们如何利用models提供的API的特性获得 ...

  6. svn的使用技巧

    就是如果想一个文件在提交的时候不被上传,可以设置忽略这样提交的时候就不会被上传

  7. 3-51单片机WIFI学习(开发板8266底层源码介绍)

    上一篇链接  http://www.cnblogs.com/yangfengwu/p/8743502.html 直接上源码:注意源码有两部分,第一部分是一开始的时候写在模块内部的,另一部分是存在手机内 ...

  8. mybatis的mapper接口代理使用的三个规范

    1.什么是mapper代理接口方式? MyBatis之mapper代理方式.mapper代理使用的是JDK的动态代理策略 2.使用mapper代理方式有什么好处 使用这种方式可以不用写接口的实现类,免 ...

  9. 实现一个网易云音乐的 BottomSheetDialog

    作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...

  10. Go语言的核心Routine-Channel

    前言 Go语言通过routine,提供了并发编程的支持. Routine特性 (1) goroutine是Go语言运行库的功能,不是操作系统提供的功能,goroutine不是用线程实现的. 例:启动一 ...