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)的更多相关文章

  1. 迭代加深搜索 POJ 1129 Channel Allocation

    POJ 1129 Channel Allocation Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 14191   Acc ...

  2. poj 2248 Addition Chains (迭代加深搜索)

    [题目描述] An addition chain for n is an integer sequence with the following four properties: a0 = 1 am ...

  3. BZOJ 1085 骑士精神 迭代加深搜索+A*

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1085 题目大意: 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个 ...

  4. vijos1308 埃及分数(迭代加深搜索)

    题目链接:点击打开链接 题目描写叙述: 在古埃及.人们使用单位分数的和(形如1/a的, a是自然数)表示一切有理数.如:2/3=1/2+1/6,但不同意2/3=1/3+1/3,由于加数中有同样的.对于 ...

  5. POJ1129Channel Allocation[迭代加深搜索 四色定理]

    Channel Allocation Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 14601   Accepted: 74 ...

  6. BZOJ1085: [SCOI2005]骑士精神 [迭代加深搜索 IDA*]

    1085: [SCOI2005]骑士精神 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1800  Solved: 984[Submit][Statu ...

  7. 迭代加深搜索 codevs 2541 幂运算

    codevs 2541 幂运算  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题目描述 Description 从m开始,我们只需要6次运算就可以计算出 ...

  8. HDU 1560 DNA sequence (IDA* 迭代加深 搜索)

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1560 BFS题解:http://www.cnblogs.com/crazyapple/p/321810 ...

  9. UVA 529 - Addition Chains,迭代加深搜索+剪枝

    Description An addition chain for n is an integer sequence  with the following four properties: a0 = ...

随机推荐

  1. spring,spring mvc,mybatis 常用注解

    文章来源:https://www.cnblogs.com/hello-tl/p/9209063.html  0.在spring,soring mvc, mybistis 中的常用注解有一下 <! ...

  2. ThreadLocalClient小应用

    今天遇到hibernate.find就会进行权限配置,如果某处想要跳过权限配置,则可以如下 ThreadLocalClient.get().envParamMap.put(DataAuthority. ...

  3. C#自定义Excel操作类

    C#自定义Excel操作类,可以用于将DataTable导出到Excel文件,从Excel文件读取数据. using System; using System.IO; using System.Dat ...

  4. SQL Server on Red Hat Enterprise Linux

    本文从零开始一步一步介绍如何在Red Hat Enterprise Linux上搭建SQL Server 2017,包括安装系统.安装SQL等相关步骤和方法(仅供测试学习之用,基础篇). 一.   创 ...

  5. HDU 3879 Base Station

    Base Station Time Limit: 2000ms Memory Limit: 32768KB This problem will be judged on HDU. Original I ...

  6. [uiautomator篇] python uiautomatorDemo

    #coding=utf-8 """ @version: 1.0 @author: @prerequisite: based on Python 2.7 @usage: 1 ...

  7. nginx的详解(二)

    查看几个设置 nginx正则表达式常用的是前6个 ^: 匹配字符串的开始位置: $:匹配字符串的结束位置:.*: .匹配任意字符,*匹配数量0到正无穷: \. 斜杠用来转义,\.匹配 . 特殊使用方法 ...

  8. Infinite monkey theorem(hdu 3689)

    题意:问随机生成一个长度为m(m<=1000)长度的字符串,出现某个子串s的概率是多少. /* KMP+DP 设f[i][j]表示A生成到第i位,此时B串匹配到第j位的概率. 转移方程为f[i+ ...

  9. UVa10234 Race

    递推,设有i个人排在第一名,剩下的人排在后面,方案有f[i]种,则f[i]=sum(c[n][i]*f[n-i]) 1<=i<=n /*by SilverN*/ #include<a ...

  10. JavaScript 数组操作函数--转载+格式整理

    JavaScript 数组操作函数(部分)--转载+格式整理 今天看了一篇文章,主要讲的对常用的Js操作函数:push,pop,join,shift,unshift,slice,splice,conc ...