poj3414Pots(倒水BFS)
| Time Limit: 1000MS | Memory Limit: 65536K | |||
| Total Submissions: 13231 | Accepted: 5553 | Special Judge | ||
Description
You are given two pots, having the volume of A and B liters respectively. The following operations can be performed:
- FILL(i) fill the pot i (1 ≤ i ≤ 2) from the tap;
- DROP(i) empty the pot i to the drain;
- POUR(i,j) pour from pot i to pot j; after this operation either the pot j is full (and there may be some water left in the pot i), or the pot i is empty (and all its contents have been moved to the pot j).
Write a program to find the shortest possible sequence of these operations that will yield exactly C liters of water in one of the pots.
Input
On the first and only line are the numbers A, B, and C. These are all integers in the range from 1 to 100 and C≤max(A,B).
Output
The first line of the output must contain the length of the sequence of operations K. The following K lines must each describe one operation. If there are several sequences of minimal length, output any one of them. If the desired result can’t be achieved, the first and only line of the file must contain the word ‘impossible’.
Sample Input
3 5 4
Sample Output
6
FILL(2)
POUR(2,1)
DROP(1)
POUR(2,1)
FILL(2)
POUR(2,1)
#include"cstdio"
#include"cstring"
#include"queue"
#include"algorithm"
using namespace std;
const int MAXN=;
struct node{
int a,b,op,pre;
node(int ca,int cb,int co,int cp):a(ca),b(cb),op(co),pre(cp){}
node(){}
};
const char* opit[]={"","FILL(1)","FILL(2)","DROP(1)","DROP(2)","POUR(1,2)","POUR(2,1)"};
int vis[MAXN][MAXN];
int A,B,C;
node step[MAXN*MAXN];
int cnt;
void print(int now,int ans)//??????
{
node no = step[now];
if(no.pre==-)
{
printf("%d\n",ans);
return ;
}
print(no.pre,ans+);
printf("%s\n",opit[no.op]);
}
void bfs()
{
memset(vis,,sizeof(vis));
cnt=;
queue<node> que;
que.push(node(,,,-));
while(!que.empty())
{
node now = que.front();que.pop();
step[cnt++]=now;
if(now.a==C||now.b==C)
{
print(cnt-,);
return ;
}
int ta,tb;
//第一种操作 FILL(A)
ta=A,tb=now.b;
if(!vis[ta][tb])
{
vis[ta][tb]=;
que.push(node(ta,tb,,cnt-));
} //第二种操作 FILL(B)
ta=now.a,tb=B;
if(!vis[ta][tb])
{
vis[ta][tb]=;
que.push(node(ta,tb,,cnt-));
}
//第三种操作 DROP(A)
ta=,tb=now.b;
if(!vis[ta][tb])
{
vis[ta][tb]=;
que.push(node(ta,tb,,cnt-));
}
//第四种操作 DROP(B)
ta=now.a,tb=;
if(!vis[ta][tb])
{
vis[ta][tb]=;
que.push(node(ta,tb,,cnt-));
}
//第五种操作 POUR(A,B)
ta=now.a-min(B-now.b,now.a);
tb=now.b+min(B-now.b,now.a);
if(!vis[ta][tb])
{
vis[ta][tb]=;
que.push(node(ta,tb,,cnt-));
}
//第六种操作 POUR(B,A)
ta=now.a+min(A-now.a,now.b);
tb=now.b-min(A-now.a,now.b);
if(!vis[ta][tb])
{
vis[ta][tb]=;
que.push(node(ta,tb,,cnt-));
}
}
printf("impossible\n");
}
int main()
{
while(scanf("%d%d%d",&A,&B,&C)!=EOF)
{
bfs();
}
return ;
}
poj3414Pots(倒水BFS)的更多相关文章
- hdu1495 倒水bfs
题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1495/ 题意:给定三个杯子S,M,N,满足S=M+N,现在要求用最短的次数将S杯中的饮倒平分到两个杯子中.我们首 ...
- HDOJ1495(倒水BFS)
非常可乐 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- POJ 3414 Pots【bfs模拟倒水问题】
链接: http://poj.org/problem?id=3414 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22009#probl ...
- codevs1226倒水问题(Bfs)
/* 首先建立模型 可以看成是三个水杯 第三个无穷大 (这里看成是201足够了) 最少步数 想到Bfs 维护队列里的状态:要有个步数 还要有v :此时刻三个杯子有多少水 然后倒水:因为没有刻度 所以有 ...
- HDU 1495 非常可乐(BFS倒水问题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1495 题目大意:只有两个杯子,它们的容量分别是N 毫升和M 毫升 可乐的体积为S (S<101) ...
- HDU 1495 非常可乐【BFS/倒水问题】
非常可乐 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi ...
- CodeVS 1226 倒水问题【DFS/BFS】
题目描述 Description 有两个无刻度标志的水壶,分别可装 x 升和 y 升 ( x,y 为整数且均不大于 100 )的水.设另有一水 缸,可用来向水壶灌水或接从水壶中倒出的水, 两水壶间,水 ...
- POJ - 3414 Pots BFS(著名倒水问题升级版)
Pots You are given two pots, having the volume of A and B liters respectively. The following operati ...
- BFS(倒水问题) HDU 1495 非常可乐
题目传送门 /* BFS:倒水问题,当C是奇数时无解.一共有六种情况,只要条件符合就入队,我在当该状态vised时写了continue 结果找了半天才发现bug,泪流满面....(网上找份好看的题解都 ...
随机推荐
- iOS应用的执行原理
本文转自:http://www.cnblogs.com/oc-bowen/p/6061261.html http://www.cnblogs.com/oc-bowen/p/6061178.html 一 ...
- Java编程中的一些常见问题汇总
转载自 http://macrochen.iteye.com/blog/1393502 每天在写Java程序,其实里面有一些细节大家可能没怎么注意,这不,有人总结了一个我们编程中常见的问题.虽然一般 ...
- Java实现微信网页授权
开发前的准备: 1.需要有一个公众号(我这里用的测试号),拿到AppID和AppSecret: 2.进入公众号开发者中心页配置授权回调域名.具体位置:接口权限-网页服务-网页账号-网页授权获取用户基本 ...
- rtpdataheader.h
#ifndef RTPDATAHEADER_H #define RTPDATAHEADER_H // For 32bit intel machines typedef short int16; typ ...
- sublime 添加 颜色插件 colorcoder
高亮所有变量,因此可以极大的简化代码定位.尤其是对那些有阅读障碍的程序员非常有帮助.
- Data Structure Binary Tree: Construct Full Binary Tree from given preorder and postorder traversals
http://www.geeksforgeeks.org/full-and-complete-binary-tree-from-given-preorder-and-postorder-travers ...
- python 3 并发编程之多进程 multiprocessing模块
一 .multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程. ...
- 斐波那契 (Fibonacci)数列
尾递归会将本次方法的结果计算出来,直接传递给下个方法.效率很快. 一般的递归,在本次方法结果还没出来的时候,就调用了下次的递归, 而程序就要将部分的结果保存在内存中,直到后面的方法结束,再返回来计算. ...
- 处理 javax.el.ELException: Failed to parse the expression 报错
在JSP的表达式语言中,使用了 <h3>是否新Session:${pageContext.session.new}</h3> 输出Session是否是新的,此时遇到了 j ...
- matlab产生很多个相同的数字
如产生100行1列的0.5: ones(100,1)*0.5: