HDU Pots
来源:互联网 发布:同济大学软件学院电话 编辑:程序博客网 时间:2024/06/09 17:03
这是一道简单的广搜(bfs)题。
题意为给定两个杯子的容量,初始时为空,用四种倒法倒出题中所给的数,输出最小倒的次数和倒水路径。第一种是把第1杯装满或把第2杯装满,第二种是把第1杯的水倒掉或把第2杯的水倒掉,第三种倒法是把第一杯中的水倒入第二杯或把第二杯中的水倒入第一杯。
思路:广搜(bfs),枚举8种可能出现的情况,用pre记录上一个倒法在vec中的位置,now表示这种倒法在vec中的位置,递归输出就是倒水路径。任意一杯水倒出所给数量均可,倒不出来就输出impossible。
AC代码如下:
#include<iostream>
#include<cmath>
#include<string>
#include<string.h>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
struct node
{
int x,y;
int min;
int p1;
int p2;
int pre;
int now;
}e;
int n,m,b,c;
bool jud[101][101];
int f,ff,i,j,k;
queue <node> q;
vector<node> v;
void print(node s)
{
if (s.pre==-1) return;
else {
print(v[s.pre]);
if (v[s.now].p1==0) cout<<"FILL("<<v[s.now].p2<<")"<<endl;
else if (v[s.now].p1==1) cout<<"DROP("<<v[s.now].p2<<")"<<endl;
else if (v[s.now].p1==2) cout<<"POUR("<<v[s.now].p2/10<<","<<v[s.now].p2%10<<")"<<endl;
}
}
void bfs(node no)
{
if (no.x==c||no.y==c) {f=1;cout<<no.min<<endl;print(no);return;}
node no1=no;
no1.min=no1.min+1;
no1.x=m;no1.p1=0;no1.p2=1;
no1.pre=no.now;
if (!jud[no1.x][no1.y])
{
jud[no1.x][no1.y]=1;
no1.now=v.size();
v.push_back(no1);
q.push(no1);
}
no1.x=no.x;no1.y=n;no1.p1=0;no1.p2=2;
if (!jud[no1.x][no1.y])
{
jud[no1.x][no1.y]=1;
no1.now=v.size();
v.push_back(no1);
q.push(no1);
}
no1.x=0;no1.y=no.y;no1.p1=1;no1.p2=1;
if (!jud[no1.x][no1.y])
{
jud[no1.x][no1.y]=1;
no1.now=v.size();
v.push_back(no1);
q.push(no1);
}
no1.x=no.x;no1.y=0;no1.p1=1;no1.p2=2;
if (!jud[no1.x][no1.y])
{
jud[no1.x][no1.y]=1;
no1.now=v.size();
v.push_back(no1);
q.push(no1);
}
if (no.x+no.y<=n)
{no1.x=0;no1.y=no.x+no.y;no1.p1=2;no1.p2=12;}
else {no1.x=no.x+no.y-n;no1.y=n;no1.p1=2;no1.p2=12;}
if (!jud[no1.x][no1.y])
{
jud[no1.x][no1.y]=1;
no1.now=v.size();
v.push_back(no1);
q.push(no1);
}
if (no.x+no.y<=m)
{no1.x=no.x+no.y;no1.y=0;no1.p1=2;no1.p2=21;}
else {no1.x=m;no1.y=no.x+no.y-m;no1.p1=2;no1.p2=21;}
if (!jud[no1.x][no1.y])
{
jud[no1.x][no1.y]=1;
no1.now=v.size();
v.push_back(no1);
q.push(no1);
}
}
int main()
{
ios::sync_with_stdio(false);
while(cin>>m>>n>>c)
{
node a;v.clear();memset(jud,0,sizeof(jud));
a.x=0;a.y=0;a.p1=a.p2=-1;
a.min=0;a.pre=-1;a.now=0;
v.push_back(a);ff=0;
queue <node> qq;q=qq;
f=0;jud[0][0]=1;
q.push(a);
while (!q.empty())
{
node k=q.front();
q.pop();
bfs(k);
if (f) break;
}
if (!f) cout<<"impossible"<<endl;
}
return 0;
}
- HDU Pots
- Pots
- Pots
- Pots
- Pots
- Pots
- Pots
- pots
- pots
- Pots
- Pots
- Pots
- Pots
- Pots
- Pots
- Pots
- Pots
- Pots
- 调用者信息属性(C#5)
- MATLAB入门教程
- js获取url参数
- python实现电话号码映射
- ModelAndView模型视图类
- HDU Pots
- 生产消费
- uva 307 bfs优化剪枝
- spark RDD详解及源码分析
- spring framework中的自动装配和自动检测
- [LintCode]Longest Common Substring(Python)
- 排序整理
- js 判断时间不能超过3个月
- GUI