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】献给阿尔吉侬的花束
[题目描述] 阿尔吉侬是一只聪明又慵懒的小白鼠,它最擅长的就是走各种各样的迷宫.今天它要挑战一个非常大的迷宫,研究员们为了鼓励阿尔吉侬尽快到达终点,就在终点放了一块阿尔吉侬最喜欢的奶酪.现在研究员们想 ...
随机推荐
- 数据结构实验之二叉树五:层序遍历 (SDUT 3344)
#include <bits/stdc++.h> using namespace std; struct node { char data; struct node *lc, *rc; } ...
- WEB自动化测试(UFT与Selenium)课程及视频教程
自动化测试UFT与Selenium详细视频教程科目如下: 1.自动化测试基础-2.UFT自动化测试详解-3.UFT高级测试开发-4.自动化测试框架设计-5.UFT综合实战-6自动化测试-Seleniu ...
- ROS机器人开发实践学习笔记3
摘要: 刚刚开始学习ROS,打算入机器人的坑了,参考教材是<ROS及其人开发实践>胡春旭编著 机械工业出版社 华章科技出品.本来以为可以按照书上的步骤一步步来,但是,too young t ...
- Python经典练习题1:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
Python经典练习题 网上能够搜得到的答案为: for i in range(1,85): if 168 % i == 0: j = 168 / i; if i > j and (i + j) ...
- 【零基础】风格迁移之deep-painterly-harmonization的安装和使用
注:原项目名叫deep-painterly-harmonization,这里我缩写下称呼其为“DPH” 注:原项目GIT链接:https://github.com/luanfujun/deep-pai ...
- 通过generate解析SQL日志生成xml进行SQL回放
查看Oracle redo日志来分析SQL执行记录 1)设置Oracle数据字典导出路径参数(可选) shutdown immediatealter system set UTL_FILE_DIR=' ...
- SQL-W3School-基础:SQL INSERT INTO 语句
ylbtech-SQL-W3School-基础:SQL INSERT INTO 语句 1.返回顶部 1. INSERT INTO 语句 INSERT INTO 语句用于向表格中插入新的行. 语法 IN ...
- Tomca的启动与关闭
点击startup.bat启动,遇到一闪而过的问题,可能尚未配置JAVA_HOME 8080端口被占用导致启动失败 关闭Tomcat的三种方式 * 点击x (不推荐) * 双击shutdown.bat ...
- es6 map()和filter()详解【转】
原文地址:http://www.zhangxinxu.com/wordpress/2013/04/es5%e6%96%b0%e5%a2%9e%e6%95%b0%e7%bb%84%e6%96%b9%e6 ...
- Zabbix 3.4.3 使用阿里云短信服务进行报警
目录 一.阿里云短信服务 1.1.首先开通阿里云短信服务 1.2 创建签名 1.3 创建短信模板 1.4 创建发送脚本 二.Zabbix Web 配置 2.1 增加 Media types 2.2 给 ...