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,泪流满面....(网上找份好看的题解都 ...
随机推荐
- Python菜鸟之路:Python基础——函数
一.函数 1. 简介 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段.函数能提高应用的模块性,和代码的重复利用率. 2. 组成 函数代码块以 def 关键词开头,后接函数名和圆括号( ...
- Difference Between ZIP and GZIP
From: http://www.differencebetween.net/technology/difference-between-zip-and-gzip/ Summary: 1. GZIP ...
- Swift来了,是不是能够入手IOS开发了?
在今天的WWDC2014上,苹果公布了一种全新的Swift.在苹果高管 Craig Federighi 的描写叙述中,Swift 在各个方面优于 Objective-C,也不会有那么多复杂的符号和表达 ...
- PHP网页导出Word文档的方法分离
今天要探讨的是PHP网页导出Word文档的方法,使用其他语言的朋友也可以参考,因为原理是差不多的. 原理 一般,有2种方法可以导出doc文档,一种是使用com,并且作为php的一个扩展库安装到服务器上 ...
- PHP实现今天是星期几的几种写法
今天是星期几的写法有很多,本文整理了常用的三种. 代码如下: // 第一种写法 $da = date("w"); if( $da == "1" ){ ec ...
- HackerRank - camelcase 【字符串】
思路 找单词 第一个 单词 是小写 然后 后面的单词 第一位 都是大写 刚开始 初始化 ans = 1 然后 往后遍历 碰到 大写的 更新答案 AC代码 #include <cstdio> ...
- PAT 天梯赛 L3-001. 凑零钱 【DP】【DFS】
题目链接 https://www.patest.cn/contests/gplt/L3-001 思路 DP[I][J] I 表示第几个物品 J 表示多少钱 dp[i][j] 为 bool 值 表示 当 ...
- 【leetcode刷提笔记】Permutations
Given a collection of numbers, return all possible permutations. For example,[1,2,3] have the follow ...
- X-real-ip与X-Forwarded-For
经过反向代理后,客户端与web服务器之间添加了中间层,因此: 1.代理服务器使用$remote_addr拿到的会是客户端的ip 2. web服务器使用$remote_addr拿到的会是代理服务器的ip ...
- 20145229吴姗珊《java程序设计》第2次实验报告
20145229吴姗珊<java程序设计>第2次实验报告 实验名称 Java面向程序设计,采用TDD的方式设计有关实现复数类Complex. 理解并掌握面向对象三要素:封装.继承.多态. ...