博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 3414 Pots([kuangbin带你飞]专题一 简单搜索)
阅读量:4683 次
发布时间:2019-06-09

本文共 1552 字,大约阅读时间需要 5 分钟。

题目连接:

题目大意:给你A,B两个杯子和一同水,问你能用两个杯子倒出C的水吗,

解题思路,这个题和这个题很相似,其实差不多,但是这个题比较麻烦一些,,标记各种情况

#include
#include
#include
#include
#include
using namespace std;int a,b,c;const int maxn = 100+5;int r,l,v[maxn][maxn];pair
q[maxn*maxn];int x[maxn*maxn],p[maxn*maxn],op[maxn*maxn],d[maxn*maxn];void init(){ memset(x,0,sizeof(x)); memset(p,0,sizeof(p)); memset(op,0,sizeof(op)); memset(d,0,sizeof(d));}void check(int i,int j,int o,int k){ //A中的水是i,B中的水是j,操作方法是0,操作的杯子是k if(v[i][j]) return ; v[i][j]=1; //标记当前状态 p[r]=l; //标记当前位置 op[r]=o,x[r]=k,d[r]=d[l]+1; //op记录操作方法,x记录操作的杯子,d记录操作的次数 q[r++]=make_pair(i,j); //把新状态放在队列里面 }int bfs(){ int ca,cb=l=r=0; q[r++]=make_pair(0,0); memset(v,0,sizeof(v)); v[0][0]=1; while(r>l){ ca = q[l].first; cb = q[l].second; if(ca == c || cb == c) return l; check(a,cb,1,1); //装满A中的水 check(ca,b,1,2); //装满B中的水 check(0,cb,2,1); //倒掉A中的水 check(ca,0,2,2); //倒掉B中的水 if(ca > b - cb) check(ca - b + cb , b,3,1); //把A中的水倒满B else check(0,ca+cb,3,1); if(cb > a - ca ) check(a,cb-a+ca,3,2); //把B中的水倒满A else check(ca+cb,0,3,2); ++l; //队列加一 } return 0;}void print(int k){ if(p[k]>0) print(p[k]); if(op[k] == 1) printf("FILL(%d)\n", x[k]); if(op[k] == 2) printf("DROP(%d)\n", x[k]); if(op[k] == 3) printf("POUR(%d,%d)\n", x[k], 3 - x[k]);}int main(){ while(~scanf("%d%d%d",&a,&b,&c)){ init(); int ans=0; if(ans=bfs()){ printf("%d\n",d[ans]); print(ans); }else printf("impossible\n"); } return 0;}

转载于:https://www.cnblogs.com/Double-LL/p/6658896.html

你可能感兴趣的文章
编写jquery插件
查看>>
敏捷开发笔记
查看>>
学前班
查看>>
关于自关联1
查看>>
hdu-1814(2-sat)
查看>>
谷歌浏览器,添加默认搜索引擎的搜索地址
查看>>
数据结构化与保存
查看>>
为什么需要Docker?
查看>>
国内5家云服务厂商 HTTPS 安全性测试横向对比
查看>>
how to control project
查看>>
转 python新手容易犯的6个错误
查看>>
第四节 -- 列表
查看>>
决策树
查看>>
团队作业
查看>>
如何避免在简单业务逻辑上面的细节上面出错
查看>>
大型网站高并发的架构演变图-摘自网络
查看>>
8丶运行及总结
查看>>
WPF中使用USERCONTROL
查看>>
图片,base64 互转
查看>>
cache—主存—辅存三级调度模拟
查看>>