Pots(bfs)
| Time Limit: 1000MS | Memory Limit: 65536K | |||
| Total Submissions: 8266 | Accepted: 3507 | 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) 题意:给定三个数A B C,前两个数代表容量为A和B的容器,有三种操作,FILL,DROP,POUR;求最少经过几次这样的操作可以得到容量为C的水; 思路:因为每个容器都有FILL,DROP,POUR三种操作,将两个容器的状态用队列来维护,两个容器共有六种操作的可能;
另一个关键是打印路径,可以用一个结构体数组保存前驱,通过栈再将路径打印出来;
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
#include<stack>
//各种状态
#define FILL_A 1;
#define FILL_B 2;
#define DROP_A 3;
#define DROP_B 4;
#define POURA_B 5;
#define POURB_A 6;
using namespace std; struct node
{
int x,y;
int step;
};
queue<struct node>que; struct Path
{
int x,y;
int way;
}path[][];//保存前驱; int vis[][];
int a,b,c; //打印路径
void Print_Path(int x, int y)
{
stack<struct Path>st;
while(!st.empty())
st.pop(); while(!(x == && y == ))
{
st.push(path[x][y]);
int sx = path[x][y].x;
int sy = path[x][y].y;
x = sx;
y = sy;
} while(!st.empty())
{
switch(st.top().way)
{
case :printf("FILL(1)\n");break;
case :printf("FILL(2)\n");break;
case :printf("DROP(1)\n");break;
case :printf("DROP(2)\n");break;
case :printf("POUR(1,2)\n");break;
case :printf("POUR(2,1)\n");break;
}
st.pop();
}
} void bfs()
{
while(!que.empty())
que.pop();
que.push((struct node){,,});//初始状态进队列
vis[][] = ;
while(!que.empty())
{
struct node u = que.front();
que.pop();
if(u.x == c || u.y == c)
{
printf("%d\n",u.step);
Print_Path(u.x,u.y);
return;
}
//FILL_A
if(u.x < a && !vis[a][u.y])
{
vis[a][u.y] = ;
que.push((struct node){a,u.y,u.step+});
path[a][u.y] = (struct Path){u.x,u.y,};
}
//FILL_B
if(u.y < b && !vis[u.x][b])
{
vis[u.x][b] = ;
que.push((struct node){u.x,b,u.step+});
path[u.x][b] = (struct Path){u.x,u.y,};
}
//DROP_A
if(u.x > && !vis[][u.y])
{
vis[][u.y] = ;
que.push((struct node){,u.y,u.step+});
path[][u.y] = (struct Path){u.x,u.y,};
}
//DROP_B
if(u.y > && !vis[u.x][])
{
vis[u.x][] = ;
que.push((struct node){u.x,,u.step+});
path[u.x][] = (struct Path){u.x,u.y,};
}
//POURA_B
if(u.x < a && u.y > )
{
int tmp = min(a-u.x,u.y);
if(!vis[u.x+tmp][u.y-tmp])
{
vis[u.x+tmp][u.y-tmp] = ;
que.push((struct node){u.x+tmp,u.y-tmp,u.step+});
path[u.x+tmp][u.y-tmp] = (struct Path){u.x,u.y,};
}
}
//POURB_A
if(u.x > && u.y < b)
{
int tmp = min(u.x,b-u.y);
if(!vis[u.x-tmp][u.y+tmp])
{
vis[u.x-tmp][u.y+tmp] = ;
que.push((struct node){u.x-tmp,u.y+tmp,u.step+});
path[u.x-tmp][u.y+tmp] = (struct Path){u.x,u.y,};
}
}
}
printf("impossible\n");
}
int main()
{
scanf("%d %d %d",&a,&b,&c);
memset(vis,,sizeof(vis));
bfs();
return ;
}
Pots(bfs)的更多相关文章
- POJ 3414 Pots(BFS)
Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu Description You are g ...
- poj 3414 Pots(bfs+输出路径)
Description You are given two pots, having the volume of A and B liters respectively. The following ...
- POJ3414—Pots(bfs加回溯)
http://poj.org/problem?id=3414 Pots Time Limit: 1000MS Memor ...
- POJ - 3414 Pots BFS(著名倒水问题升级版)
Pots You are given two pots, having the volume of A and B liters respectively. The following operati ...
- POJ3414 Pots —— BFS + 模拟
题目链接:http://poj.org/problem?id=3414 Pots Time Limit: 1000MS Memory Limit: 65536K Total Submissions ...
- POJ 3414 Pots (BFS/DFS)
Pots Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7783 Accepted: 3261 Special Ju ...
- poj 3414 Pots bfs+模拟
#include<iostream> #include<cstring> #define fillA 1 #define pourAB 2 #define dropA 3 #d ...
- POJ 3414 Pots bfs打印方案
题目: http://poj.org/problem?id=3414 很好玩的一个题.关键是又16ms 1A了,没有debug的日子才是好日子.. #include <stdio.h> # ...
- POJ 3414 Pots ( BFS , 打印路径 )
题意: 给你两个空瓶子,只有三种操作 一.把一个瓶子灌满 二.把一个瓶子清空 三.把一个瓶子里面的水灌到另一个瓶子里面去(倒满之后要是还存在水那就依然在那个瓶子里面,或者被灌的瓶子有可能没满) 思路: ...
随机推荐
- mac tips
1. Mac Terminal color for different types 在 ~ 先建立一个文件 ~/.bash_profile 加入下面的两行:export CLICOLOR=1expo ...
- POJ - 3608 Bridge Across Islands【旋转卡壳】及一些有趣现象
给两个凸包,求这两个凸包间最短距离 旋转卡壳的基础题 因为是初学旋转卡壳,所以找了别人的代码进行观摩..然而发现很有意思的现象 比如说这个代码(只截取了关键部分) double solve(Point ...
- poj1742 Coins(多重背包+单调队列优化)
/* 这题卡常数.... 二进制优化或者单调队列会被卡 必须+上个特判才能过QAQ 单调队列维护之前的钱数有几个能拼出来的 循环的时候以钱数为步长 如果队列超过c[i]就说明队头的不能再用了 拿出来 ...
- ASP.NET Boilerplate 工作单元
从上往下说起,框架使用castle拦截器,拦截实现了IApplication.IRepository接口的所有方法,和使用了UnitOfWork 特性的方法,代码如下 internal class U ...
- css3购物网站商品文字提示实例
css3购物网站商品文字提示实例先来看效果图:<ignore_js_op> 当鼠标划过图片时,有着泰迪熊黑色长方形的背景就会出现.来看HTML5+CSS3代码: <!DOCTYPE ...
- 让ie6/7/8兼容css3的圆角阴影等特殊效果的方法 PIE1.0.0及placeholder在这些IE下生效的方法
PIE地址:http://css3pie.com/ 使用方法1: #login,#AnnouncementBox { border:3px solid #fff; -webkit-border-r ...
- for循环,如何结束多层for循环
采用标签方式跳出,指定跳出位置, a:for(int i=0;i<n;i++) { b:for(int j=0;j<n;j++) { if(n=0) { break a; } } }
- linux常用编辑器
管理员在进行系统操作的时候,不可避免地会对文本进行修改,如进行各种服务程序配置文件的改动,使程序对用户提供不同的服务效果.在本章我们向大家介绍Linux上常见的编辑器ed.vi.emacs,同时以vi ...
- webpack学习笔记一(入门)
webpack集成了模块加载和打包等功能 ,这两年在前端领域越来越受欢迎.平时一般是用requirejs.seajs作为模块加载用,用grunt/gulp作为前端构建.webpack作为模块化加载兼容 ...
- JS判断浏览器是否支持某一个CSS3属性的方法
var div = document.createElement('div'); console.log(div.style.transition); //如果支持的话, 会输出 "&quo ...