[poj 2331] Water pipe ID A*迭代加深搜索(dfs)
Water pipe
Time Limit: 3000MS Memory Limit: 65536K
Total Submissions: 2265 Accepted: 602
Description
The Eastowner city is perpetually haunted with water supply shortages, so in order to remedy this problem a new water-pipe has been built. Builders started the pipe from both ends simultaneously, and after some hard work both halves were connected. Well, almost. First half of pipe ended at a point (x1, y1), and the second half – at (x2, y2). Unfortunately only few pipe segments of different length were left. Moreover, due to the peculiarities of local technology the pipes can only be put in either north-south or east-west direction, and be connected to form a straight line or 90 degree turn. You program must, given L1, L2, … Lk – lengths of pipe segments available and C1, C2, … Ck – number of segments of each length, construct a water pipe connecting given points, or declare that it is impossible. Program must output the minimum required number of segments.
Constraints
1 <= k <= 4, 1 <= xi, yi, Li <= 1000, 1 <= Ci <= 10
Input
Input contains integers x1 y1 x2 y2 k followed by 2k integers L1 L2 … Lk C1 C2 … Ck
Output
Output must contain a single integer – the number of required segments, or −1 if the connection is impossible.
Sample Input
20 10 60 50 2 70 30 2 2
Sample Output
4
Source
Northeastern Europe 2003, Far-Eastern Subregion
题目链接: id=2331">http://poj.org/problem?id=2331
题意:
在二维网格上给你起点,终点,与(n《=10)的管子(长度与数量)用最少的管子数完毕路径;
思路:由于管子不能切断。所以“盲目”dfs 长路漫漫。。。
仅仅好迭代加深!
——————–分开计算x。y轴————————–
1.预处理*h数组。计算i状态到终点(单维)的最最短路(估价系统)
for(ans=1;ans<=tot;ans++){if(dfs(a,sx,0,0)) break;}
2.“盲目”dfs(+剪枝)到终点(单维)
剪*
if(hv==-1||hv+dep>ans) return 0;
代码:
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
struct node{
int l,num;
}a[11];
int n,h1[1010],h2[1010],ans;
int tx,ty,sx,sy;
int tot;
void cal(int *h,int pos)
{
queue<int> q;
h[pos]=0;
q.push(pos);
while(!q.empty())
{
pos=q.front();
q.pop();
for(int i=1;i<=n;i++)
{
int nex=pos-a[i].l;
if(nex>0&&h[nex]==-1)
{
h[nex]=h[pos]+1;
q.push(nex);
}
nex+=2*a[i].l;
if(nex<=1000&&h[nex]==-1)
{
h[nex]=h[pos]+1;
q.push(nex);
}
}
}
}
bool dfs(node *a,int x,int dep,int id)
{
int hv;
if(id==0) hv=h1[x];else hv=h2[x];
if(hv==-1||hv+dep>ans) return 0;
if(hv==0)
{
if(id==0) return dfs(a,sy,dep,1);
else return 1;
}
node tmp[10];
for(int i=1;i<=n;i++) tmp[i]=a[i];
for(int i=1;i<=n;i++)
if(tmp[i].num)
{
tmp[i].num--;
int now=x-tmp[i].l;
if(now>0) if(dfs(tmp,now,dep+1,id)) return 1;
now+=2*tmp[i].l;
if(now<=1000) if(dfs(tmp,now,dep+1,id)) return 1;
tmp[i].num++;
}
return 0;
}
void id_a_star()
{
memset(h1,-1,sizeof(h1));
memset(h2,-1,sizeof(h2));
cal(h1,tx);
cal(h2,ty);
for(ans=1;ans<=tot;ans++)
{
if(dfs(a,sx,0,0)) break;
}
if(ans<=tot)
printf("%d\n",ans);
else printf("-1\n");
}
int main()
{
scanf("%d%d%d%d%d",&sx,&sy,&tx,&ty,&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i].l);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i].num);
tot+=a[i].num;
}
if(sx==tx&&sy==ty) printf("0\n");
else id_a_star();
}
[poj 2331] Water pipe ID A*迭代加深搜索(dfs)的更多相关文章
- 迭代加深搜索 POJ 1129 Channel Allocation
POJ 1129 Channel Allocation Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 14191 Acc ...
- poj 2248 Addition Chains (迭代加深搜索)
[题目描述] An addition chain for n is an integer sequence with the following four properties: a0 = 1 am ...
- BZOJ 1085 骑士精神 迭代加深搜索+A*
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1085 题目大意: 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个 ...
- vijos1308 埃及分数(迭代加深搜索)
题目链接:点击打开链接 题目描写叙述: 在古埃及.人们使用单位分数的和(形如1/a的, a是自然数)表示一切有理数.如:2/3=1/2+1/6,但不同意2/3=1/3+1/3,由于加数中有同样的.对于 ...
- POJ1129Channel Allocation[迭代加深搜索 四色定理]
Channel Allocation Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 14601 Accepted: 74 ...
- BZOJ1085: [SCOI2005]骑士精神 [迭代加深搜索 IDA*]
1085: [SCOI2005]骑士精神 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1800 Solved: 984[Submit][Statu ...
- 迭代加深搜索 codevs 2541 幂运算
codevs 2541 幂运算 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 从m开始,我们只需要6次运算就可以计算出 ...
- HDU 1560 DNA sequence (IDA* 迭代加深 搜索)
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1560 BFS题解:http://www.cnblogs.com/crazyapple/p/321810 ...
- UVA 529 - Addition Chains,迭代加深搜索+剪枝
Description An addition chain for n is an integer sequence with the following four properties: a0 = ...
随机推荐
- Python9-集合-day7
集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的. 以下是集合最重要的两点: 去重,把一个列表变成集合,就自动去重了. 关系测试 ...
- C++ STL容器底层机制
1.vector容器 vector的数据安排以及操作方式,与array非常相似.两者的唯一区别在于空间的运用的灵活性.array是静态空间,一旦配置了就不能改变.vector是动态空间,随着元素的加入 ...
- HDU 4283 区间DP You Are the One
题解 我使用记忆化搜索写的.
- Nmap手册
转自:http://drops.xmd5.com/static/drops/tips-4333.html 0x00:说明 只是一个快速查询手册,理论的东西都没有补充,欢迎大家积极在评论区补充自己常用的 ...
- PTA 10-排序4 统计工龄 (20分)
题目地址 https://pta.patest.cn/pta/test/15/exam/4/question/721 5-13 统计工龄 (20分) 给定公司NN名员工的工龄,要求按工龄增序输出每 ...
- C/C++ 位操作
C/C++对位操作有如下方法: <1>位操作运算符(注意:下面几个运算符不改变原来的变量的值,只是获得运算的结果即一个新值) 按位取反:~ 位与:& 位或:| 位异或:^ 左移位运 ...
- EasyUI 获取行ID,符合条件的添加样式
function GetTableTrID() { var p = $('#PreFixgrid').prev().find('div table:eq(1)'); var ID = $(p).fin ...
- shell的echo命令
echo是Shell的一个内部指令,用于在屏幕上打印出指定的字符串.命令格式: echo arg 您可以使用echo实现更复杂的输出格式控制. 显示转义字符 echo "\"It ...
- BZOJ 3227 [Sdoi2008]红黑树(tree) ——贪心 动态规划
首先可以想到一个贪心的方法,然后一层一层的合并. 也可以采用动态规划的方式,为了写起来好写,把点数*2+1,然后发现在本机上跑不过1500的数据. 交上去居然A掉了. 贪心 #include < ...
- 常州模拟赛d4t1 立方体
题目描述 立方体有 6 个面,每个面上有一只奶牛,每只奶牛都有一些干草.为了训练奶牛的合作精神,它 们在玩一个游戏,每轮:所有奶牛将自己的干草分成 4 等份,分给相邻的 4 个面上的奶牛. 游戏开始, ...