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】献给阿尔吉侬的花束
[题目描述] 阿尔吉侬是一只聪明又慵懒的小白鼠,它最擅长的就是走各种各样的迷宫.今天它要挑战一个非常大的迷宫,研究员们为了鼓励阿尔吉侬尽快到达终点,就在终点放了一块阿尔吉侬最喜欢的奶酪.现在研究员们想 ...
随机推荐
- WEB自动化测试(UFT与Selenium)课程及视频教程
自动化测试UFT与Selenium详细视频教程科目如下: 1.自动化测试基础-2.UFT自动化测试详解-3.UFT高级测试开发-4.自动化测试框架设计-5.UFT综合实战-6自动化测试-Seleniu ...
- P3368 【模板】树状数组 2
原题链接 https://www.luogu.org/problemnew/show/P3368 这个题和洛谷P3374树状数组1 有些不同,在普通的树状数组上运用了差分的知识.(由于P3374涉及 ...
- 利用Python爬取朋友圈数据,爬到你开始怀疑人生
人生最难的事是自我认知,用Python爬取朋友圈数据,让我们重新审视自己,审视我们周围的圈子. 文:朱元禄(@数据分析-jacky) 哲学的两大问题:1.我是谁?2.我们从哪里来? 本文 jacky试 ...
- c 判断是否为nan
/* isnan example */ #include <stdio.h> /* printf */ #include <math.h> /* isnan, sqrt */ ...
- 多层树级关系的json,递归删除空值的数据
data =[{ "name": "省", "children":[ { "name": "市区", ...
- JAVA基础知识|抽象类与接口类
一.抽象类 抽象类:拥有抽象方法的类就是抽象类,抽象类要使用abstract声明 抽象方法:没有方法体的方法,必须要使用abstract修饰 为什么要使用抽象类,抽象方法? 举例来说,如果你定义了一个 ...
- sql语句 基本
1.sql不区分大小写,一般结尾要加分号: 2.select 列,列,列 from 表 3.distinct ,返回列中不同的值.需要哪个列不同,关键词哪个列 4.where子句,select 列 f ...
- 安装windows下安装mysql
参考文档:https://www.cnblogs.com/reyinever/p/8551977.html https://www.jb51.net/article/151213.htm 首先下载m ...
- PHP mysql_num_rows() 函数 返回结果集中行的数目。
定义和用法 mysql_num_rows() 函数返回结果集中行的数目. 语法 mysql_num_rows(data) 参数 描述 data 必需.结果集.该结果集从 mysql_query() 的 ...
- linux简单命令7--管道符和通配符
”&&“和管道符“|”不一样. ---------------------------------------------------------通配符---------------- ...