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.题目1# 给一个字符串,统计其中的数字.字母和其他类型字符的个数:# 比如输入“124mid-=”,输出:数字=3,字 ...
- 右键打开cmd
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\Directory\shell\OpenCmdHere]@="Open cmd ...
- ASP跳出FOR循环
由于ASP不能使用GOTO语句,我在FOR循环中加入一个FOR循环,若需要跳出,即退出最里面那个FOR循环. DEMO: <%dim aa = 0for i = 1 to 10 for j ...
- 【网络与系统安全】20179209 wireshark和nmap实验
TCP三次握手包 在进行实验前,先梳理一遍TCP三次握手的过程,这个图是我本科学网络时画过不少于十遍的图,我觉得非常有纪念意义. 稍作解释,第一次握手,客户端发起请求连接,发送一个标志位为SYN的ip ...
- shell脚本调试运行
1.在命令行提供参数:$sh -x script.sh 但是有的shell脚本只能用 ./xxx.sh的方式运行,不能用sh命令解析执行.则此方法会报错.2.脚本开头提供参数:#!/bin/sh ...
- 路由器桥接(WIFI无线中继)设置及摆放位置图解
路由器桥接(WIFI无线中继)设置及摆放位置图解 WIFI实在好用,但它的波覆盖面小.穿透力很差.我们安装时要考虑波的衍射特点,装在衍射效果最佳的位置(居中,室外可绕,避开密封墙).确实无法兼顾的地方 ...
- NVM安装配置
http://www.kancloud.cn/summer/nodejs-install/71975 配置源 http://www.cnblogs.com/kaiye/p/4937191.html 安 ...
- PAT 天梯赛 L2-009. 抢红包 【排序】
题目链接 https://www.patest.cn/contests/gplt/L2-009 思路 用结构体存储,然后结构体排序 注意一下 个人编号是从 1 开始 计数的 AC代码 #include ...
- 图形用户界面(GUI)事件监听机制——窗体事件Frame
窗体事件.Button的使用 本事例给出一个窗体的定义方法,基本属性设置,给窗体添加退出按钮,让按钮具备退出的功能.熟悉监听器的使用 按钮就是事件源. 那么选择哪一个监听器呢? 通过关闭窗体事例了解到 ...
- 【leetcode刷题笔记】Reverse Words in a String
Given an input string, reverse the string word by word. For example,Given s = "the sky is blue& ...