POJ 3414 Pots
Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u
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)
注:本人英语很渣,题目大意大多来自百度~=0=
题目大意:
给出了两个瓶子的容量a,b, 以及一个目标水量n
对A、B可以有如下操作:
FILL(i) 把i倒满
DROP(i) 把i倒空
POUR(i,j) 把i倒入j
问经过哪几个操作后能使得任意一个瓶子的水量为C。
若不可能得到则输出impossible
输入就是A(a) B(b) C(n)
输出第一行是一共需要几次操作
下面是每行是一次操作
解题思路 :
BFS
每次操作有8种可能(额,我是按照自己题解写的序号 将就着看吧=0=)
a倒入b时:
1.倒满, a剩余
7.倒空,a为0
b倒入a时:
2.倒满, b剩余
8.倒空,b为0
当a不满时
3.FILL(a)
当b不满时
4.FILL(b)
当a != 0时
5.倒空a
当b != 0时
6.倒空b
由于输出需要步骤,所以我用结构体保存了前一个状态的oa, ob, oc(原因是这三个都需要才能找到上一个操作)
代码如下:
#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <queue>
#define N 110
#define INF 0xfffffff
using namespace std;
int a, b, n;
bool f[N][N][]; //f用来判断此状态是不是已经使用过
struct node
{
int a, b, step, oa, ob, c, oc;//a, b 状态的下标, c 状态操作 o+..是指前一个状态
}s, e, ans[N][N][]; //ans用来保存每一个状态的值
void Putc(int c)
{
if(c == || c == ) printf("POUR(1,2)\n");
if(c == ) printf("DROP(1)\n");
if(c == || c == ) printf("POUR(2,1)\n");
if(c == ) printf("DROP(2)\n");
if(c == ) printf("FILL(1)\n");
if(c == ) printf("FILL(2)\n");
}
void inPut(node s)
{
int d[N], dd = ;
printf("%d\n", s.step);
d[dd++] = s.c;
while(s.a || s.b) {
s = ans[s.oa][s.ob][s.oc];
d[dd++] = s.c; //将之前每一个操作储存起来 最后输出 因为如果直接输出顺序回事反的
}
for(int i = dd - ; i >= ; i--)
Putc(d[i]);
}
void Init() //初始化
{
memset(f, false, sizeof(f));
memset(ans, , sizeof(ans));
}
void BFS()
{
queue<node>q;
s = {, , };
q.push(s);
f[s.a][s.b][s.c] = ;
while(!q.empty()) {
s = q.front();
q.pop();
if(s.a == n || s.b == n) {
inPut(s);
return;
}
if(s.a != ) {
//a->b
if(s.a + s.b > b){//b被倒满a有剩余
e = {s.a - (b - s.b), b, s.step + , s.a, s.b, , s.c};
if(!f[e.a][e.b][e.c])
q.push(e), f[e.a][e.b][e.c] = , ans[e.a][e.b][e.c] = e;
}
else {//a倒b 无剩余
e = {, s.a + s.b, s.step + , s.a, s.b, , s.c};
if(!f[e.a][e.b][e.c])
q.push(e), f[e.a][e.b][e.c] = , ans[e.a][e.b][e.c] = e;
}
//倒空a
e = {, s.b, s.step + , s.a, s.b, , s.c};
if(!f[e.a][e.b][e.c])
q.push(e), f[e.a][e.b][e.c] = , ans[e.a][e.b][e.c] = e;
}
if(s.b != ) {
//b->a
if(s.a + s.b > a){//a被倒满b有剩余
e = {a, s.b - (a - s.a), s.step + , s.a, s.b, , s.c};
if(!f[e.a][e.b][e.c])
q.push(e), f[e.a][e.b][e.c] = , ans[e.a][e.b][e.c] = e;
}
else {//b倒a 无剩余
e = {s.a + s.b, , s.step + , s.a, s.b, , s.c};
if(!f[e.a][e.b][e.c])
q.push(e), f[e.a][e.b][e.c] = , ans[e.a][e.b][e.c] = e;
}
//~倒空b
e = {s.a, , s.step + , s.a, s.b, , s.c};
if(!f[e.a][e.b][e.c])
q.push(e), f[e.a][e.b][e.c] = , ans[e.a][e.b][e.c] = e;
}
//把a加满
if(s.a != a) {
e = {a, s.b, s.step + , s.a, s.b, , s.c};
if(!f[e.a][e.b][e.c])
q.push(e), f[e.a][e.b][e.c] = , ans[e.a][e.b][e.c] = e;
}
//把b加满
if(s.b != b){
e = {s.a, b, s.step + , s.a, s.b, , s.c};
if(!f[e.a][e.b][e.c])
q.push(e), f[e.a][e.b][e.c] = , ans[e.a][e.b][e.c] = e;
}
}
printf("impossible\n");
}
int main()
{
while (~scanf("%d %d %d", &a, &b, &n)) {
Init();
BFS();
}
}
POJ 3414 Pots的更多相关文章
- 广搜+输出路径 POJ 3414 Pots
POJ 3414 Pots Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13547 Accepted: 5718 ...
- POJ 3414 Pots(罐子)
POJ 3414 Pots(罐子) Time Limit: 1000MS Memory Limit: 65536K Description - 题目描述 You are given two po ...
- poj 3414 Pots 【BFS+记录路径 】
//yy:昨天看着这题突然有点懵,不知道怎么记录路径,然后交给房教了,,,然后默默去写另一个bfs,想清楚思路后花了半小时写了120+行的代码然后出现奇葩的CE,看完FAQ改了之后又WA了.然后第一次 ...
- BFS POJ 3414 Pots
题目传送门 /* BFS:六种情况讨论一下,BFS轻松解决 起初我看有人用DFS,我写了一遍,TLE..还是用BFS,结果特判时出错,逗了好长时间 看别人的代码简直是受罪,还好自己终于发现自己代码的小 ...
- poj 3414 Pots【bfs+回溯路径 正向输出】
题目地址:http://poj.org/problem?id=3414 Pots Time Limit: 1000MS Memory Limit: 65536K Total Submissions ...
- POJ 3414 Pots【bfs模拟倒水问题】
链接: http://poj.org/problem?id=3414 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22009#probl ...
- poj 3414 Pots(广搜BFS+路径输出)
转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:id=3414">http://poj.org/probl ...
- poj 3414 Pots ( bfs )
题目:http://poj.org/problem?id=3414 题意:给出了两个瓶子的容量A,B, 以及一个目标水量C, 对A.B可以有如下操作: FILL(i) fill the ...
- POJ 3414 Pots bfs打印方案
题目: http://poj.org/problem?id=3414 很好玩的一个题.关键是又16ms 1A了,没有debug的日子才是好日子.. #include <stdio.h> # ...
随机推荐
- 关于HandlerThread的分析
Android中的Thread没有对java中的Thread做任何封装,而Android提供了一个遍历方法HandlerThread,他继承于Thread,实现了对遍历系统的一些封装,下面研究一下Ha ...
- UUID工具
package com.tech.jin.util; import java.util.UUID; public class UuidUtil { public static String get32 ...
- [原]excel启动时死锁
项目中遇到的一个死锁问题! 代码大概如下: 调用SetWinEventHook安装了进程内钩子,dll注入到excel进程后,专门开启一个线程来分发监听到的事件信息,并在该线程内会获取IAcces ...
- 杀死mapreduce
在做mapreduce的时候,ctrl+c 其实就是在doc命令下杀死了mapreduce显示,后台还是有在运行mapreduce的程序 可以http://namenode.hadoop:8088/ ...
- 位图切割器&位图裁剪器
位图切割器: 虽然网上有类似的工具,PhotoShop 也有类似功能,但前者似乎不支持超大位图切割(以 G 计大小),而后者的切割块数量好像有比较小的限定范围,于是自己动手写了这个工具. 至于为什么是 ...
- 常用的logging配置
centos 6.5,python 2.6 习惯封装一个log.py #!/usr/bin/python # -*- coding: UTF-8 -*- import logging from log ...
- 关于node.js杂记
https://gitlore.com/page/gitlore-git/nodejs/index.html[node.js中文文档] ////// https://gitlore.com/in ...
- 关于php的开源
这里的开源是指编写php的C语言的源代码是开放的,你可以下载下来c源代码去修改然后重新编译连接得到自己的程序. 比如php不支持多线程一直是广为被人所诟病的,你也可以让它变相的支持多线程,比如face ...
- arguments的理解
(function(){ return typeof arguments; })(); 无聊的时候看看网上的面试题.个人认为通过面试题可以对某个知识点能够更加认识,踩过坑才会明白坑是有多大.代码中经常 ...
- html,css命名规范 (转)
HTML+CSS命名规范总结 1.HTML部分 1.1添加必须的utf-8的字符集,并且使用HTML5的简洁 方式: <meta charset="utf-8"> 1. ...