Pots POJ - 3414 (搜索+记录路径)
|
Pots
Description You are given two pots, having the volume of A and B liters respectively. The following operations can be performed:
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 Source Northeastern Europe 2002, Western Subregion
|
||||||||||
题意:
有二个水壶,对水壶有三种操作:
1)FILL(i),将i水壶的水填满;
2)DROP(i),将水壶i中的水全部倒掉;
3)POUR(i,j)将水壶i中的水倒到水壶j中,若水壶 j 满了,则 i 剩下的就不倒了,问进行多少步操作,并且怎么操作,输出操作的步骤,两个水壶中的水可以达到C这个水量。如果不可能则输出impossible。初始时两个水壶是空的,没有水。
思路:
模拟一下,然后如果当前的状态已经出现过了就说明不可以这样子,必须要用其他操作,这个和poj3087的题目有点像,这里还需要储存一个路径,这个和poj3984有点像,poj3984之前的博客里面用了递归的方式输出路径,这一回用了栈,两种方法应该都可以做的,具体的看代码吧,注释已经很清楚了
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<set>
#include<stack>
#include<vector>
using namespace std;
#define INF 0x3f3f3f3f
#define eps 1e-10
#define PI acos(-1.0)
#define _e exp(1.0)
#define ll long long
const int maxn=;
struct cup
{
int x,y; //a和b的当前水的状态
int step;
int flag; //标记操作,是操作几
cup *pre; //记录路径的玩意儿
};
queue<cup>que;
stack<int>R;
int a,b,e;
int vis[maxn][maxn]={}; //记录当前的状态是否到达过
int ans; void bfs(int x,int y)
{
cup c;
cup t[]; //目前瓶子里剩余的水量
c.x=;
c.y=;
c.flag=;
c.pre=NULL;
c.step=;
que.push(c);
vis[x][y]=;
int count=-;
while(!que.empty())
{
count++;
t[count]=que.front();
que.pop();
for(int i=;i<=;i++)
{
switch(i)
{
case : //fill a
c.x=a;
c.y=t[count].y;
c.flag=;
break;
case : //fill b
c.x=t[count].x;
c.y=b;
c.flag=;
break;
case : //drop a
c.x=;
c.y=t[count].y;
c.flag=;
break;
case : //drop b
c.x=t[count].x;
c.y=;
c.flag=;
break;
case : //pour a to b
if(t[count].x>b-t[count].y) //a可以装满b
{
c.x=t[count].x-(b-t[count].y);
c.y=b;
}
else //a不能装满b
{
c.x=;
c.y=t[count].y+t[count].x;
}
c.flag=;
break;
case : //pour b to a
if(t[count].y>a-t[count].x) //b可以装满a
{
c.y=t[count].y-(a-t[count].x);
c.x=a;
}
else //b不可以装满a
{
c.x=t[count].x+t[count].y;
c.y=;
}
c.flag=;
break;
}
if(vis[c.x][c.y])
continue;
vis[c.x][c.y]=;
c.step=t[count].step+;
c.pre=&t[count];
if(c.x==e || c.y==e)
{
ans=c.step;
while(c.pre)
{
R.push(c.flag);
c=*c.pre;
}
return;
}
que.push(c);
}
}
}
void print()
{
while(!R.empty())
{
int i=R.top();
R.pop();
switch(i)
{
case :cout<<"FILL(1)"<<endl;break;
case :cout<<"FILL(2)"<<endl;break;
case :cout<<"DROP(1)"<<endl;break;
case :cout<<"DROP(2)"<<endl;break;
case :cout<<"POUR(1,2)"<<endl;break;
case :cout<<"POUR(2,1)"<<endl;break;
}
}
}
int main()
{
cin>>a>>b>>e;
bfs(,);
if(ans==)
cout<<"impossible"<<endl;
else
{
cout<<ans<<endl;
print();
}
return ;
}
Pots POJ - 3414 (搜索+记录路径)的更多相关文章
- Pots(POJ - 3414)【BFS 寻找最短路+路径输出】
Pots(POJ - 3414) 题目链接 算法 BFS 1.这道题问的是给你两个体积分别为A和B的容器,你对它们有三种操作,一种是装满其中一个瓶子,另一种是把其中一个瓶子的水都倒掉,还有一种就是把其 ...
- hdu 1664(数论+同余搜索+记录路径)
Different Digits Time Limit: 10000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- Pots POJ 3414
/* *POJ 3414 *简单模板bfs *编程应该为了方便理解,尽量提供接口 */ #include<cstdio> #include<algorithm> #includ ...
- - 迷宫问题 POJ - 3984 bfs记录路径并输出最短路径
定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, ...
- kuangbin专题 专题一 简单搜索 Pots POJ - 3414
题目链接:https://vjudge.net/problem/POJ-3414 题意:给你两个杯子,分别容量为A(1),B(2)和一个C,C是需要经过下列操作,得到的一个升数.(1) FILL(i) ...
- 迷宫问题 (bfs广度优先搜索记录路径)
问题描述: 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, ...
- POJ 3414 Pot (输出路径)【BFS】
<题目链接> 题目大意: 有两个容量的空杯子,能够对这两个空杯子进行三种操作: 分别是fill(a),装满a杯子: drop(a),倒空a杯子: pour(a,b),将a杯子中的水倒入b杯 ...
- poj 1787 背包+记录路径
http://poj.org/problem?id=1787 Charlie's Change Time Limit: 1000MS Memory Limit: 30000K Total Subm ...
- poj 2395 bfs/记录路径
http://poj.org/problem?id=2935 Basic Wall Maze Time Limit: 1000MS Memory Limit: 65536K Total Submi ...
随机推荐
- 转 oracle数据仓库部署注意事项(OLAP)
https://blog.csdn.net/laven54/article/details/9840365 最近数据库升级到11G之后,出现一些问题,慢慢的开始发现一些需要总结的东西,每次心里都在想: ...
- 010 Regular Expression Matching 正则表达式匹配
Implement regular expression matching with support for '.' and '*'.'.' Matches any single character. ...
- HDU 5785 Interesting manacher + 延迟标记
题意:给你一个串,若里面有两个相邻的没有交集的回文串的话,设为S[i...j] 和 S[j+1...k],对答案的贡献是i*k,就是左端点的值乘上右端点的值. 首先,如果s[x1....j].s[x2 ...
- Java local 转UTC时间
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; impor ...
- Storm概念学习系列 之数据流模型、Storm数据流模型
不多说,直接上干货! 数据流模型 数据流模型是由数据流.数据处理任务.数据节点.数据处理任务实例等构成的一种数据模型.本节将介绍的数据流模型如图1所示. 分布式流处理系统由多个数据处理节点(node) ...
- JQury各种ajax函数
$.get(url,[data],[callback],[type]) 说明:以get方式发送请求,url为请求地址,data为请求数据的列表,callback为请求成功后的回调函数,该函数接受两个参 ...
- SpringBoot的快速构建
1.http://start.spring.io2.Spring Tool Suite3.IntelliJ IDEA4.Spring Boot CLI5.Maven手工构建
- HDevEngine in .NET Applications MultiThreading
Basics To use HDevEngine in Visual Studio .NET, you must add a reference to the HALCON/.NET assembly ...
- npm常用指令小记
查看本地指定包在npm远程服务器的版本信息 方式一: npm view <packageName> versions 方式二: npm info <packageName> 查 ...
- GIT教程笔记
GIT的工作流程: 先在工作目录中添加.修改文件 一般是在工作目录建立你的工程文件夹,然后通过命令行进入文件夹后 git init 初始化 将需要进行版本管理的文件放入缓存区 git add 文件 ...