poj2331 (IDA*)
来源:互联网 发布:私营企业调查数据库 编辑:程序博客网 时间:2024/06/12 19:52
题意:给你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;}
0 0
- poj2331 (IDA*)
- poj2331 ida*
- POJ2331:Water pipe(IDA*)
- poj2331 Water pipe IDA*
- IDA* POJ2331 Water pipe
- #POJ2331#Water pipe(IDA*_搜索)
- POJ2331 Water pipe
- IDA*(poj 2286)
- HDU1685Booksort(IDA* 搜索)
- ida入门(2)
- ida入门(3)
- ida入门(4)
- 埃及分数(IDA*)
- 迭代深搜+A*(IDA*)
- IDA
- ida
- IDA*
- IDA*
- Python 第三方 http 库-Requests 学习
- 就这么开始
- Android面试题及答案5
- EasyUI datetimebox 的onchange事件的问题
- pt与px区别
- poj2331 (IDA*)
- Android面试题及答案6
- GCD
- leetcode17 Letter Combinations of a Phone Number
- 关于C#接口作用的理解
- 加快进度!!!
- 单次遍历,带权随机选取问题(二)
- 1.4 Palindrome Permutation
- c/c++里的 堆区 栈区 静态区 文字常量区 程序代码区