Pots(POJ-3414)【BFS】
题意:有两个有着固定容量的茶壶,初始时都为空,要求用FILL,POUR,DROP三种操作来准确地得到C值,输出最少次数及操作方案。
思路:比赛的时候真是脑子不好使,根本没想到是搜索,看了别人的题解用搜索,恍然大悟。
以两茶壶均为空为初始状态,每次对六种操作进行枚举,BFS加记录路径即可。
代码如下:
#include<cstdio>
#include<queue>
#include<vector>
using namespace std;
struct water{
int ta[],steps;
water(){}
water(int x,int y,int z){
ta[]=x;ta[]=y;
steps=y;
}
};
typedef pair<water,int> P;
char op[][]={"FILL(1)\n","FILL(2)\n","DROP(1)\n","DROP(2)\n","POUR(1,2)\n","POUR(2,1)\n"};
int a[],c; P fill(water wt,int i){
wt.steps++;
if(wt.ta[i]<a[i])
{
wt.ta[i]=a[i];
return P(wt,);
}
return P(wt,);
} P drop(water wt,int i){
wt.steps++;
if(wt.ta[i]>){
wt.ta[i]=;
return P(wt,);
}
return P(wt,);
} P pour(water wt,int i,int j){
wt.steps++;
if(wt.ta[i]==||wt.ta[j]==a[j])
return P(wt,);
int x=wt.ta[]+wt.ta[],y=;
if(x>a[j]){
y=x-a[j];
x=a[j];
}
wt.ta[i]=y;wt.ta[j]=x;
return P(wt,);
}
int main(){
scanf("%d%d%d",&a[],&a[],&c);
queue<water> q;
q.push(water(,,));
int book[][]={},ansFind=;
water pre[][],ending;
while(!q.empty()){
water wt=q.front();
q.pop();
if(wt.ta[]==c||wt.ta[]==c){
ending=wt;
ansFind=wt.steps;
break;
}
for(int i=;i<=;i++){
P ha=fill(wt,i);
if(ha.second&&!book[ha.first.ta[]][ha.first.ta[]]){
book[ha.first.ta[]][ha.first.ta[]]=;
q.push(ha.first);
pre[ha.first.ta[]][ha.first.ta[]]=wt;
pre[ha.first.ta[]][ha.first.ta[]].steps=i;
}
}
for(int i=;i<=;i++){
P ha=drop(wt,i);
if(ha.second&&!book[ha.first.ta[]][ha.first.ta[]]){
book[ha.first.ta[]][ha.first.ta[]]=;
q.push(ha.first);
pre[ha.first.ta[]][ha.first.ta[]]=wt;
pre[ha.first.ta[]][ha.first.ta[]].steps=i+;
}
}
for(int i=;i<=;i++){
P ha=pour(wt,i,-i);
if(ha.second&&!book[ha.first.ta[]][ha.first.ta[]]){
book[ha.first.ta[]][ha.first.ta[]]=;
q.push(ha.first);
pre[ha.first.ta[]][ha.first.ta[]]=wt;
pre[ha.first.ta[]][ha.first.ta[]].steps=i+;
}
}
}
if(ansFind){
vector<int> ans;
water tmp=ending,start=water(,,);
printf("%d\n",ansFind);
while((tmp.ta[]+tmp.ta[])!=){
tmp=pre[tmp.ta[]][tmp.ta[]];
ans.push_back(tmp.steps);
}
for(int i=ans.size()-;i>=;i--){
printf("%s",op[ans[i]-]);
}
}
else printf("impossible");
return ;
}
By xxmlala
Pots(POJ-3414)【BFS】的更多相关文章
- Pots(POJ - 3414)【BFS 寻找最短路+路径输出】
Pots(POJ - 3414) 题目链接 算法 BFS 1.这道题问的是给你两个体积分别为A和B的容器,你对它们有三种操作,一种是装满其中一个瓶子,另一种是把其中一个瓶子的水都倒掉,还有一种就是把其 ...
- Pots POJ - 3414【状态转移bfs+回溯】
典型的倒水问题: 即把两个水杯的每种状态视为bfs图中的点,如果两种状态可以转化,即可认为二者之间可以连一条边. 有3种倒水的方法,对应2个杯子,共有6种可能的状态转移方式.即相当于图中想走的方法有6 ...
- 【BFS】POJ 3414
直达 -> POJ 3414 Pots 相似题联动–>HDU 1495 非常可乐 题意:两个壶倒水,三种操作,两个桶其中一个满足等于C的最少操作,输出路径.注意a,b互倒的时候能不能倒满, ...
- 【BFS】HDU 1495
直达–> HDU 1495 非常可乐 相似题联动–>POJ 3414 Pots 题意:中文题,不解释. 思路:三个杯子倒来倒去,最后能让其中两个平分即可.可能性六种.判定的时候注意第三个杯 ...
- poj3278-Catch That Cow 【bfs】
http://poj.org/problem?id=3278 Catch That Cow Time Limit: 2000MS Memory Limit: 65536K Total Submis ...
- 【bfs】抓住那头牛
[题目] 农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上,农夫起始位于点N(0≤N≤100000),牛位于点K(0≤K≤100000).农夫有两种移动方式: 1.从X移动到X-1或X+1,每次 ...
- 【bfs】拯救少林神棍(poj1011)
Description 乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位.然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度.请你 ...
- 【bfs】Knight Moves
[题目描述] 输入nn代表有个n×nn×n的棋盘,输入开始位置的坐标和结束位置的坐标,问一个骑士朝棋盘的八个方向走马字步,从开始坐标到结束坐标可以经过多少步. [输入] 首先输入一个nn,表示测试样例 ...
- 【bfs】1252 走迷宫
[题目描述] 一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走:有的格子是空地,可以走. 给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能走到).只能在水平方向或垂直方向走,不 ...
- 【bfs】献给阿尔吉侬的花束
[题目描述] 阿尔吉侬是一只聪明又慵懒的小白鼠,它最擅长的就是走各种各样的迷宫.今天它要挑战一个非常大的迷宫,研究员们为了鼓励阿尔吉侬尽快到达终点,就在终点放了一块阿尔吉侬最喜欢的奶酪.现在研究员们想 ...
随机推荐
- (转)python正向连接后门
python正向连接后门 PHITHON 2014 四月 12 00:12 阅读:16670 Python python, cmd后门, socket python在linux ...
- windows下去掉快捷方式图标的小箭头的几种方法
去掉快捷方式图标的小箭头的几种方法 第一种: 点开始菜单,点运行,输入以下命令后回车.即可解决 cmd /k reg delete "HKEY_CLASSES_ROOT\lnkfile&qu ...
- gitlab配置邮箱postfix(新用户激活邮件)
亲测可用 https://www.cnblogs.com/yoyoketang/p/10287345.html
- 表单事件集锦-input
最近在写一个手机端提交表单的项目,里面用了不少input标签,因为项目不太忙,所以,想做的完美点,但是遇到了一些问题,比如:页面中的必填项如果有至少一项为空,提交按钮就是不能提交的状态,所以需要对所有 ...
- php-fpm(绕过open_basedir,结合ssrf)
环境的安装->https://www.cnblogs.com/zaqzzz/p/11870489.html 1.nginx的畸形访问 因为安装的是php7.0,所以需要手动修改一下(版本低的时候 ...
- 网络文件共享服务—vsftpd服务
文件传输协议(FTP) 文件传输协议:File Transfer Protocol是用于在网络上进行文件传输的一套标准协议,使用客户/服务器模式.它属于网络传输协议的应用层. 服务器端:vsftpd ...
- 问题MySQL Error (2013): Lost connection to MySQL server at waiting for initial communication packet
错误说明: SQL Error (2013): Lost connection to MySQL server at 'waiting for initial communication packet ...
- [MySql]当虚拟机的IP地址自动更换后,JDBC使用原来的配置连不上MySql数据库时所报的异常。
Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. ...
- Mac下持续集成-Jenkins权限设置
部署上后集成Jmeter玩了一晚上,后来发现账号登录不进去了,
- UML期末复习题——2.5:System Sequence Diagram & Post-condition
第五题:系统顺序图 重要概念: 1.对象: 对象是特定行为与属性的集合. 对象的表示方式有三种: a.包括对象名和类名 b.只有类名. c.只有对象名 2.消息表示形式: 消息用于描述对象间交互的方式 ...