(poj)3414 Pots (输出路径的广搜)
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 ( ≤ i ≤ ) 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 to 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 Sample Output FILL()
POUR(,)
DROP()
POUR(,)
FILL()
POUR(,)
题意 有两个杯子体积a和b升,有六个操作,经过几次操作可使至少其中一杯水有c升,并输出操作方法
方法 利用广搜,每种状态由可操作的状态向下搜索,找到一种就为操作次数最少的,找到输出操作方法
#include <iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<vector>
#include <math.h>
#include<queue>
#define ll long long
#define met(a,b) memset(a,b,sizeof(a));
#define N 405
using namespace std;
char str[][]={"FILL(2)","FILL(1)","POUR(2,1)","POUR(1,2)","DROP(1)","DROP(2)"};
int n,m,k,f;
int vis[N][N];
struct node
{
int x,y,t;
char s[];///记录路径过程 s[i] i代表第i步做str[s[i]]这个操作
};
void dfs()
{
queue<node> Q;
node q,p;
q.x=;
q.y=;
q.t=;
strcpy(q.s,"");///记得初始化
vis[][]=;
Q.push(q);
while(Q.size())
{
p=Q.front();
Q.pop();
if(p.x==k || p.y==k)
{
f=;
printf("%d\n",p.t);
for(int i=; i<=p.t; i++)
printf("%s\n",str[p.s[i]-'']);///根据p.s储存的输出路径
break;
}
for(int i=; i<; i++)///每次一共就有六种操作可做,符合条件的才实行
{
q.t=p.t+;
q.x=;
q.y=;
strcpy(q.s,p.s);
q.s[q.t]=i+'';
if(i== && !p.y)///第二个杯子为空,装满
{
q.x=p.x;
q.y=m; }
else if(i== && !p.x)///第一个杯子为空,装满
{
q.x=n;
q.y=p.y;
}
else if(i== && p.x<n&&p.y)///第一个杯子不满,第二个杯子不空,把第二个杯子的水倒入第一个杯子里
{
if(p.x+p.y<=n)
{
q.x=p.x+p.y;
q.y=;
}
else
{
q.x=n;
q.y=p.x+p.y-n;
}
}
else if(i== && p.y<m && p.x)///第二个杯子不满,第一个杯子不空,把第一个杯子的水倒入第二个杯子里
{
if(p.x+p.y<=m)
{
q.x=;
q.y=p.x+p.y;
}
else
{
q.y=m;
q.x=p.x+p.y-m; }
}
else if(i== && p.x)///第一个杯子不空,倒完
{
q.x=;
q.y=p.y;
}
else if(i== && p.y)///第二个杯子不空,倒完
{
q.y=;
q.x=p.x;
}
if(!vis[q.x][q.y])///是否出现过,防止重复出现,死循环
{
vis[q.x][q.y]=;
Q.push(q);
}
}
}
return ;
}
int main()
{
while(scanf("%d %d %d",&n,&m,&k)!=EOF)
{
met(vis,);
f=;
dfs();
if(f==)
printf("impossible\n");
}
return ;
}
(poj)3414 Pots (输出路径的广搜)的更多相关文章
- POJ 3414 Pots 记录路径的广搜
Description You are given two pots, having the volume of A and B liters respectively. The following ...
- POJ 3414 Pot (输出路径)【BFS】
<题目链接> 题目大意: 有两个容量的空杯子,能够对这两个空杯子进行三种操作: 分别是fill(a),装满a杯子: drop(a),倒空a杯子: pour(a,b),将a杯子中的水倒入b杯 ...
- 广搜+输出路径 POJ 3414 Pots
POJ 3414 Pots Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13547 Accepted: 5718 ...
- poj 3414 Pots 【BFS+记录路径 】
//yy:昨天看着这题突然有点懵,不知道怎么记录路径,然后交给房教了,,,然后默默去写另一个bfs,想清楚思路后花了半小时写了120+行的代码然后出现奇葩的CE,看完FAQ改了之后又WA了.然后第一次 ...
- POJ 3414 Pots(罐子)
POJ 3414 Pots(罐子) Time Limit: 1000MS Memory Limit: 65536K Description - 题目描述 You are given two po ...
- 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 3984 迷宫问题 记录路径的广搜
主要是学一下如何在广搜中记录路径:每找到一个点我就记录下这个点是由那个点得来的,这样我找到最后个点后,我就可以通过回溯得到我走过的路径,具体看代码吧~ #include<cstdio> # ...
- POJ 3414 Pots【bfs模拟倒水问题】
链接: http://poj.org/problem?id=3414 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22009#probl ...
随机推荐
- Could not load db driver class: com.mysql.jdbc.Driver解决方法
14/03/26 22:43:24 ERROR sqoop.Sqoop: Got exception running Sqoop: java.lang.RuntimeException: Could ...
- POJ1006 - Biorhythms(中国剩余定理)
题目大意 略...有中文... 题解 就是解同余方程组 x≡(p-d)(mod 23) x≡(e-d)(mod 28) x≡(i-d)(mod 33) 最简单的中国剩余定理应用.... 代码: #in ...
- 由.Net类库提供的农历计算(C#农历)-获取当前日期的农历日期
; i <= chineseDate.GetMonthsInYear(DateTime.Now.Year); i++) { Console.W ...
- 仿写thinkphp的I方法
自己定义一个方法仿写thinkphp的I 方法 <?php function I($key="",$default='',$function="") { ...
- 网络爬虫之Windows环境Heritrix3.0配置指南
一.引言: 最近在忙某个商业银行的项目,需要引入外部互联网数据作为参考,作为技术选型阶段的工作,之前已经确定了中文分词工具,下一个话题就是网络爬虫的选择,目标很明确,需要下载一些财经网站的新闻信息,然 ...
- 【面试虐菜】—— Oracle中CHAR、VARCHAR的区别
1.CHAR. CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不足的自动用空格填充,所以在读取 ...
- HTML5 Canvas动画效果演示
HTML5 Canvas动画效果演示 主要思想: 首先要准备一张有连续帧的图片,然后利用HTML5 Canvas的draw方法在不同的时间 间隔绘制不同的帧,这样看起来就像动画在播放. 关键技术点: ...
- mysql 5.6 oom 图
- Eclipse启动时报需要安装"Java SE 6 Runtime"致无法启动解决方案
今天心血来潮,把MBP升级到了osx mavericks,然后启动了闲置好久的eclipse,启动时居然报错了: 若要打开Eclipse.app,您需要Java SE 6 runtime,您想现在安装 ...
- WPF非轮询方式更新数据库变化SqlDependency(数据库修改前台自动更新)
上一章节我们讲到wpf的柱状图组件,它包含了非轮询方式更新数据库变化SqlDependency的内容,但是没有详细解释,现在给大家一个比较简单的例子来说明这部分内容. 上一章节: WPF柱状图(支持数 ...