题意:给你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. IQKeyboardManager使用方法

    使用方法: 将IQKeyboardManager 和 IQSegmentedNextPrevious类文件加进项目中.在AppDelegate文件中写下以下一行代码: [IQKeyBoardManag ...

  2. 第四十四条:为所有导出的API元素编写文档注释

    简而言之,要为API编写文档,文档注释是最好,最有效的途径.对于所有可导出的API元素来说,使用文档注释应该被看作是强制性的.要 采用一致的风格来遵循标准的约定.记住,在文档注释内部出现任何的HTML ...

  3. 学大伟业 国庆Day2

    期望得分:30+100+0=130 实际得分:30+100+20=150 忍者钩爪 (ninja.pas/c/cpp) [问题描述] 小Q是一名酷爱钩爪的忍者,最喜欢飞檐走壁的感觉,有一天小Q发现一个 ...

  4. css精简命名

    想写写前言啥的,发现自己是前言无能星人. 简单吐吐槽好了,来到新公司,接手公司之前的项目,我想着也就是改改bug,慢慢来吧,粗略看了看这个项目的代码,目前仅看了html和css样式的,忍不住吐血三升. ...

  5. css中的em 简单教程 -- 转

    先附上原作的地址: https://www.w3cplus.com/css/px-to-em 习惯性的复制一遍~~~~ -------------------------------我是分界线---- ...

  6. JAVA_SE基础——6.标识符&关键字

    学会写helloworld之后,  我们就开始来认识标识符&关键字 一.标识符 标识符是指可被用来为类.变量或方法等命名的字符序列,换言之,标识符就是用户自定义的名称来标识类.变量或方法等.更 ...

  7. LeetCode & Q169-Majority Element-Easy

    Array Divide and Conquer Bit Manipulation Description: Given an array of size n, find the majority e ...

  8. Python内置函数(36)——reversed

    英文文档: reversed(seq) Return a reverse iterator. seq must be an object which has a __reversed__() meth ...

  9. MySql入门(2-2)创建数据库

    mysql -u root -p; show databases; create database apigateway; use apigateway; show tables;

  10. Python入门之函数的装饰器

    本章目录: 装饰器: 一.为什么要用装饰器 二.什么是装饰器 三.无参装饰器 四.装饰器语法糖 五.认证装饰器实现 六.叠加多个装饰器 七.带参装饰器 ======================== ...