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 ...
随机推荐
- PHPExcel探索之旅---阶段一
类似于Java,php也有操作Excel的方法,其中需要下载PHPExcel插件,将其中的Classes文件夹改名为PHPExcel并提取到根文件夹外面,将两个文件夹一起放在所需项目中 使用PHPEx ...
- AssetDatabase的方法总结
AssetDatabase的方法总结 1.AssetDatabase.FindAssets public static string[] FindAssets(string filter);publi ...
- Python3基础(4)匿名函数、装饰器、生成器、迭代器、内置函数、json&pickle序列化、软件目录开发规范、不同目录间模块调用
---------------个人学习笔记--------------- ----------------本文作者吴疆-------------- ------点击此处链接至博客园原文------ 1 ...
- SpringBoot | 第一章:第一个SpringBoot应用
springboot简单介绍 概述 SpringBoot的核心功能 优缺点 优点 缺点 工程搭建 创建项目 项目结构 pom依赖 主入口 编写controller 启动应用 总结 老生常谈 sprin ...
- spring技术小结
1.DI和IOC 依赖注入(Dependency Injection)还是控制反转(Inversion of Conctrol) bean通过依赖注入,注册到spring容器里面.spring容器通过 ...
- 从客户端(content1="<img src="/web/news/...")中检测到有潜在危险的 Request.Form 值。
在html编辑器里面加入图片提交的时候 就报一个 从客户端(content1="<img src="/web/news/...")中检测到有潜在危险的 Reques ...
- setInterval 函数
间隔指定的毫秒数不停地执行指定的代码 setInterval函数参数 codes -- 代码段的字符串表示(与eval函数的参数相同),或者是匿名函数.函数名 interval -- 间隔的毫秒数 s ...
- SpringMVC09 Converter变流器、数据回显、异常测试
1.配置web.xml文件 <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3// ...
- java8 peek
这样不会有任何的输出:Stream.of("one", "two", "three", "four").peek(e - ...
- 关于docker容器内核参数修改问题
以下内容截取自docker官方文档 地址:https://docs.docker.com/edge/engine/reference/commandline/run/#configure-namesp ...