[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 = ...
随机推荐
- 【js】【ios】【safari】【兼容问题】【转发】JS IOS/iPhone的Safari不兼容Javascript中的Date()问题
引用地址:http://www.cnblogs.com/yiven/p/6053872.html 1 var date = new Date('2016-11-11 11:11:11'); 2 d ...
- Python文件指针与Python函数
文件内指针移动:f.seek() 强调:只有t模式下read(n),n代表字符的个数,除此以外都是以字节为单位. """ 文件内容:哈哈哈哈 呵呵呵呵 "&qu ...
- django第9天(多表操作)
django第9天 models类 class Book(Model): id = AutoField(primary_key=True) name = CharField(max_length=20 ...
- (转)iOS 属性字符串
富文本的基本数据类型是NSAttributedString.**属性化字符串**(attributed string)是把属性设置到某些字符上的字符串.属性可以是任何键值对,但是为了实现富文本,则通常 ...
- vmalloc_init
/* linux/mm/vmalloc.c*/ struct vmap_area { unsigned long va_start; unsigned long va_end; unsigned lo ...
- Action的实现方式
[Pojo方式] 1.概述 Pojo(Plain Ordinary Java Object)称为简单Java类,其实就是一个JavaBean. 2.示例 /** * Pojo类方式实现Action * ...
- poj2217 Secretary 后缀数组
#include <iostream> #include <cstring> #include <string> #include <cstdio> u ...
- TOJ 4095: love168yk的选美大赛
4095: love168yk的选美大赛 Time Limit(Common/Java):1000MS/3000MS Memory Limit:65536KByteTotal Submit: ...
- 【Luogu】P1972HH的项链(链表+树状数组)
题目链接 难题,所以会讲得细一些. 首先我们想如何统计区间[l,r]内不同贝壳的个数. 第一个思路就是线段树/树状数组,query(1,r)-query(1,l-1)对不对? 然而这样是不对的. 然后 ...
- Ubuntu安装 Docker CE,VNC访问docker图形界面并安装ROS
从包安装 如果您无法使用Docker的存储库来安装Docker CE,则可以下载.deb适用于您的发行版的 文件并手动安装.每次要升级Docker CE时都需要下载新文件. 安装Docker CE,将 ...