ZOJ1005 Jugs
Posted zhanglichen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ZOJ1005 Jugs相关的知识,希望对你有一定的参考价值。
题意:有两个容量互质的容器,需要用这两个容器量出目标重量的水,找到其中一组解。
bfs,使得搜索得到的解是步数最少的,遍历前驱法输出路径~
#include<bits/stdc++.h> using namespace std; const int maxn=1e6+14; struct node { int a,b; int pre; int flag; }Node[maxn]; int last; int p; int ca,cb,n; char s[6][15] = {"fill A","fill B","empty A","empty B","pour A B","pour B A"}; unordered_map<int,int> pos; void dfs (int x) { if (Node[x].pre==-1) return; dfs (Node[x].pre); printf ("%s ",s[Node[x].flag]); } void bfs (int a,int b) { if (p>last) return; if (a==n||b==n) return; if (pos[a]!=b+1) { pos[a]=b+1; if (a<ca) { Node[++last].a=ca; Node[last].b=b; Node[last].flag=0; Node[last].pre=p; } if (b<cb) { Node[++last].a=a; Node[last].b=cb; Node[last].flag=1; Node[last].pre=p; } if (a!=0) { Node[++last].a=a; Node[last].b=b; Node[last].flag=2; Node[last].pre=p; } if (b!=0) { Node[++last].a=a; Node[last].b=0; Node[last].flag=3; Node[last].pre=p; } if (a!=0&&b<cb) { Node[++last].a=max(0,a+b-cb); Node[last].b=a+b-Node[last].a; Node[last].flag=4; Node[last].pre=p; } if (b!=0&&a<ca) { Node[++last].b=max(0,a+b-ca); Node[last].a=a+b-Node[last].b; Node[last].flag=5; Node[last].pre=p; } } p++; bfs(Node[p].a,Node[p].b); } int main () { Node[0].pre=-1; while (~scanf("%d %d %d",&ca,&cb,&n)) { p=0; last=0; pos.clear(); bfs(0,0); dfs(p); printf ("success "); } return 0; }
以上是关于ZOJ1005 Jugs的主要内容,如果未能解决你的问题,请参考以下文章
HDU 多校训练赛第一场1005 Fibonacci Sum
ACM/ICPC 之 Floyd练习六道(ZOJ2027-POJ2253-POJ2472-POJ1125-POJ1603-POJ2607)