poj 3414 Pots (bfs+线索)
| Time Limit: 1000MS | Memory Limit: 65536K | |||
| Total Submissions: 10071 | Accepted: 4237 | Special Judge | ||
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 (1 ≤ i ≤ 2) 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 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
FILL(2)
POUR(2,1)
DROP(1)
POUR(2,1)
FILL(2)
POUR(2,1)
思路:一共同拥有6种操作:把A中水倒掉,把A加满,把B里的水倒入A中。B和A类似。
罐子最大容积为100,设一个常量N=100, 开一个二维数组记录状态变化的值。
1、从水龙头往A里加水t,记录-t,
2、从水龙头往B里加水t,记录-t-N,
3、从B里面往A加水t,记录t
4、从A里面往B加水t。记录N+t
5、把A里水倒掉,记录2*N+t,(A原有水t)
6、把B里水倒掉,记录3*N+t,(B原有水t)
#include<stdio.h>
#include<queue>
#include<map>
#include<string>
#include<string.h>
using namespace std;
#define N 105
const int inf=0x1f1f1f1f;
int a,b,c,flag;
int mark[N][N];
struct node
{
int x,y,t;
friend bool operator<(node a,node b)
{
return a.t>b.t;
}
};
void prif(int x,int y) //递归输出路径
{
if(x==0&&y==0)
return ;
if(mark[x][y]>3*N)
{
prif(x,mark[x][y]-3*N);
printf("DROP(2)\n");
}
else if(mark[x][y]>2*N)
{
prif(mark[x][y]-2*N,y);
printf("DROP(1)\n");
}
else if(mark[x][y]>N)
{
int tmp=mark[x][y]-N;
prif(x+tmp,y-tmp);
printf("POUR(1,2)\n");
}
else if(mark[x][y]>0)
{
int tmp=mark[x][y];
prif(x-tmp,y+tmp);
printf("POUR(2,1)\n");
}
else if(mark[x][y]>-N)
{
int tmp=-mark[x][y];
prif(x-tmp,y);
printf("FILL(1)\n");
}
else if(mark[x][y]<-N)
{
int tmp=N+mark[x][y];
prif(x,y+tmp);
printf("FILL(2)\n");
}
}
void bfs()
{
priority_queue<node>q;
node cur,next;
mark[0][0]=inf; //该状态仅仅能出现一次。赋值为inf防止干扰其它值
mark[a][0]=-a;
mark[0][b]=-b-N;
cur.t=1;
cur.x=a;
cur.y=0;
q.push(cur);
cur.x=0;
cur.y=b;
q.push(cur);
while(!q.empty())
{
cur=q.top();
q.pop();
next.t=cur.t+1;
if(cur.x==c||cur.y==c)
{
flag=1;
printf("%d\n",cur.t);
prif(cur.x,cur.y);
return ;
}
if(cur.x<a) //向A加水
{
int tmp=a-cur.x;
next.y=cur.y;
next.x=a; //来自水龙头的水
if(!mark[next.x][next.y])
{
mark[next.x][next.y]=-tmp;
q.push(next);
}
if(cur.y>0) //来自B的水
{
int tmp=min(cur.y,a-cur.x);
next.x=cur.x+tmp;
next.y=cur.y-tmp;
if(!mark[next.x][next.y])
{
mark[next.x][next.y]=tmp;
q.push(next);
}
}
}
if(cur.y<b) //向B加水
{
int tmp=b-cur.y;
next.x=cur.x;
next.y=b; //来自水龙头的水
if(!mark[next.x][next.y])
{
mark[next.x][next.y]=-tmp-N;
q.push(next);
}
if(cur.x>0) //来自A的水
{
int tmp=min(cur.x,b-cur.y);
next.y=cur.y+tmp;
next.x=cur.x-tmp;
if(!mark[next.x][next.y])
{
mark[next.x][next.y]=tmp+N;
q.push(next);
}
}
}
if(cur.x>0) //倒掉水
{
int tmp=cur.x;
next.x=0;
next.y=cur.y;
if(!mark[next.x][next.y])
{
mark[next.x][next.y]=2*N+tmp;
q.push(next);
}
}
if(cur.y>0)
{
int tmp=cur.y;
next.y=0;
next.x=cur.x;
if(!mark[next.x][next.y])
{
mark[next.x][next.y]=3*N+tmp;
q.push(next);
}
}
}
}
int main()
{
while(scanf("%d%d%d",&a,&b,&c)!=-1)
{
memset(mark,0,sizeof(mark));
flag=0;
bfs();
if(!flag)
printf("impossible\n");
}
return 0;
}
版权声明:本文博客原创文章,博客,未经同意,不得转载。
poj 3414 Pots (bfs+线索)的更多相关文章
- POJ 3414 Pots bfs打印方案
题目: http://poj.org/problem?id=3414 很好玩的一个题.关键是又16ms 1A了,没有debug的日子才是好日子.. #include <stdio.h> # ...
- POJ 3414 Pots(BFS)
Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu Description You are g ...
- poj 3414 Pots(bfs+输出路径)
Description You are given two pots, having the volume of A and B liters respectively. The following ...
- POJ - 3414 Pots BFS(著名倒水问题升级版)
Pots You are given two pots, having the volume of A and B liters respectively. The following operati ...
- POJ 3414 Pots (BFS/DFS)
Pots Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7783 Accepted: 3261 Special Ju ...
- poj 3414 Pots bfs+模拟
#include<iostream> #include<cstring> #define fillA 1 #define pourAB 2 #define dropA 3 #d ...
- POJ 3414 Pots ( BFS , 打印路径 )
题意: 给你两个空瓶子,只有三种操作 一.把一个瓶子灌满 二.把一个瓶子清空 三.把一个瓶子里面的水灌到另一个瓶子里面去(倒满之后要是还存在水那就依然在那个瓶子里面,或者被灌的瓶子有可能没满) 思路: ...
- poj 3414 Pots 【BFS+记录路径 】
//yy:昨天看着这题突然有点懵,不知道怎么记录路径,然后交给房教了,,,然后默默去写另一个bfs,想清楚思路后花了半小时写了120+行的代码然后出现奇葩的CE,看完FAQ改了之后又WA了.然后第一次 ...
- BFS POJ 3414 Pots
题目传送门 /* BFS:六种情况讨论一下,BFS轻松解决 起初我看有人用DFS,我写了一遍,TLE..还是用BFS,结果特判时出错,逗了好长时间 看别人的代码简直是受罪,还好自己终于发现自己代码的小 ...
- 广搜+输出路径 POJ 3414 Pots
POJ 3414 Pots Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13547 Accepted: 5718 ...
随机推荐
- loj1336(数学)
传送门:Sigma Function 题意:定义f(n)为n的约数之和,求[1,n]中f值为偶数的数的个数. 分析:由题目给定公式可知,若f(n)为奇数,则相乘的每一项都必须为奇数. 每一项为奇数的条 ...
- 《C/C++专项练习》 — (3)
序 第三次C/C++专项.嗯,要抗住打击,继续加油~ 错题分析与总结 1 . 在64位系统中.有例如以下类: class A { public: void *p1; private: void *p2 ...
- jQuery UI 是建立在 jQuery JavaScript 库上的一组用户界面交互、特效、小部件及主题
jQuery UI 是建立在 jQuery JavaScript 库上的一组用户界面交互.特效.小部件及主题.无论您是创建高度交互的 Web 应用程序还是仅仅向窗体控件添加一个日期选择器,jQuery ...
- zoj3640(概率dp)
题目连接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4808 题意: 一个吸血鬼,每次可以随机的选择n个洞中的任意一个,如果 ...
- LeetCode :: Binary Tree Zigzag Level Order Traversal [tree, BFS]
Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...
- IOC框架之一Autofac
.NET领域最为流行的IOC框架之一Autofac 一.前言 Autofac是.NET领域最为流行的IOC框架之一,微软的Orchad开源程序使用的就是Autofac,Nopcommerce开源程序也 ...
- 物联网 开发板 基于ESP8266
The ESP8266 The ESP8266 is a highly integrated chip designed for the needs of an increasingly connec ...
- 以todomvc为例分析knockout、backbone和angularjs
一.整体结构 项目github地址https://github.com/tastejs/todomvc/ 排除通用的css样式文件和引用的js库文件,仅看html和js 1.1 knockoutjs版 ...
- AlarmManager的学习与实现
综述 这个类提供了一种使用系统提供的alarm服务.这个服务同意用户安排他们的应用程序在将来的某一个时间点执行.当设置的alarm响起,那么之前系统为这个alarm注冊的Intent就会自己主 ...
- CSS选项卡
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " http://www.w3.org ...