(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 ...
随机推荐
- HW3.27
import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...
- 百度的TSDB——可针对tag查询,应该类似kairosDB
天工架构 目前,天工平台的服务主要由物接入.物解析.物管理.规则引擎和时序数据库组成,并可无缝对接百度云天算智能大数据平台及基础平台产品,可提供千万级设备接入的能力,百万数据点每秒的读写性能,超高的压 ...
- DevExpress GridControl 显示行号、设置行号宽
显示行号类 /// <summary> /// GridView 显示行号 设置行号列的宽度 /// </summary> /// <param name="g ...
- SQL注入专题
SQL注入专题--整理帖 SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别, 所以目前市面的防火墙都不会对SQL注入发出警报,如果管理员没查看IIS日志的习惯,可能被 ...
- spring问题org.springframework.beans.factory.CannotLoadBeanClassException
1.看jdk是否配置正确 2.把MyEclipse里面的那个classes删除让他重新编译就没什么问题了,只要配置是对的 3.重新clean project
- Nginx/Apache图片缩略图技术
1,目的 2,使用方式 3,Nginx + Linux 缩略图实现 3.1,原理 3.2,nginx配置实现 3.3,例子 4,Apache + Windows缩略图实现 4.1,环境 4.2,原理 ...
- JDK的帧--java.util包装工具库
题词 JDK,Java Development Kit. 首先,我们必须认识到,,JDK但,但设置Java只有基础类库.它是Sun通过基础类库开发,这是唯一的.JDK书写总结的类库.从技术含量来说,还 ...
- java21 封装Response:
封装Response: /** * 封装响应信息 */ public class Response { //两个常量 public static final String CRLF="\r\ ...
- 文件和目录之chdir、fchdir和getcwd函数
每个进程都有一个当前工作目录,此目录是搜索所有相对路径名的起点(不以斜杠开始的路径名为相对路径名).当用户登录到UNIX系统时,其当前工作目录通常是口令文件(/etc/passwd)中该用户登录项的第 ...
- 【转】针对iOS VS. Android开发游戏的优劣——2013-08-25 17
http://game.dapps.net/gamedev/experience/8670.html 问题:如果你正在一个新工作室开发一款新的平板/手机游戏,你会选择iOS还是Android? 回答: ...