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 (输出路径的广搜)的更多相关文章

  1. POJ 3414 Pots 记录路径的广搜

    Description You are given two pots, having the volume of A and B liters respectively. The following ...

  2. POJ 3414 Pot (输出路径)【BFS】

    <题目链接> 题目大意: 有两个容量的空杯子,能够对这两个空杯子进行三种操作: 分别是fill(a),装满a杯子: drop(a),倒空a杯子: pour(a,b),将a杯子中的水倒入b杯 ...

  3. 广搜+输出路径 POJ 3414 Pots

    POJ 3414 Pots Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13547   Accepted: 5718   ...

  4. poj 3414 Pots 【BFS+记录路径 】

    //yy:昨天看着这题突然有点懵,不知道怎么记录路径,然后交给房教了,,,然后默默去写另一个bfs,想清楚思路后花了半小时写了120+行的代码然后出现奇葩的CE,看完FAQ改了之后又WA了.然后第一次 ...

  5. POJ 3414 Pots(罐子)

    POJ 3414 Pots(罐子) Time Limit: 1000MS    Memory Limit: 65536K Description - 题目描述 You are given two po ...

  6. BFS POJ 3414 Pots

    题目传送门 /* BFS:六种情况讨论一下,BFS轻松解决 起初我看有人用DFS,我写了一遍,TLE..还是用BFS,结果特判时出错,逗了好长时间 看别人的代码简直是受罪,还好自己终于发现自己代码的小 ...

  7. poj 3414 Pots【bfs+回溯路径 正向输出】

    题目地址:http://poj.org/problem?id=3414 Pots Time Limit: 1000MS   Memory Limit: 65536K Total Submissions ...

  8. POJ 3984 迷宫问题 记录路径的广搜

    主要是学一下如何在广搜中记录路径:每找到一个点我就记录下这个点是由那个点得来的,这样我找到最后个点后,我就可以通过回溯得到我走过的路径,具体看代码吧~ #include<cstdio> # ...

  9. POJ 3414 Pots【bfs模拟倒水问题】

    链接: http://poj.org/problem?id=3414 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22009#probl ...

随机推荐

  1. highcharts 柱形图 饼图 加URL或Click事件

    我们在做图表的时候,有时候需要在单个数据上加链接或点击事件,是在plotOptions里的events里设置的 plotOptions: { pie: { cursor: 'pointer', eve ...

  2. Step2:配置Oracle Dataguard

    接着step1我用Rman duplicate测试下. 1,2两步请参考step1中的1,2 3.startup nomount (standby),一定要是nomount. 4.rman dupli ...

  3. weblogic目录结构

    安装WEBLOGIC SERVER weblogic server 的目录结构 weblogic server的classpath变量 weblogic server使用命令行 通过管理控制台执行核心 ...

  4. 自己动手Jquery插件

    最近Web应用程序中越来越多地用到了JQuery等Web前端技术.这些技术框架有效地改善了用户的操作体验,同时也提高了开发人员构造丰富客户 端UI的效率.JQuery本身提供了丰富的操作,但是,有时候 ...

  5. Android_消息机制

    Android通过Looper.Handler来实现消息循环机制. Android的消息循环是针对线程的,每个线程都可以有自己的消息队列和消息循环. Android系统中的Looper负责管理线程的消 ...

  6. 向架构师进军---&gt;怎样编写软件架构文档

    假设你对项目管理.系统架构有兴趣,请加微信订阅号"softjg",增加这个PM.架构师的大家庭 问:为什么要编写软件架构文档,它的优点是什么? 答: 有文档的架构有助于不同利益相关 ...

  7. [RxJS] Drag and Drop example

    Improving our mouse drag event Our mouse drag event is a little too simple. Notice that when we drag ...

  8. Linux crontab 命令格式与具体样例

    基本格式 : * * * * * command 分 时 日 月 周 命令 第1列表示分钟1-59 每分钟用*或者 */1表示 第2列表示小时1-23(0表示0点) 第3列表示日期1-31 第4列表示 ...

  9. Redis学习手册(Set数据类型)

    一.概述: 在Redis中,我们可以将Set类型看作为没有排序的字符集合,和List类型一样,我们也可以在该类型的数据值上执行添加.删除或判断某一元素是否存在等操作.需要说明的是,这些操作的时间复杂度 ...

  10. vector中的resize与 reserve

    void reserve (size_type n); reserver函数用来给vector预分配存储区大小,即capacity的值 ,但是没有给这段内存进行初始化.reserve 的参数n是推荐预 ...