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】献给阿尔吉侬的花束
[题目描述] 阿尔吉侬是一只聪明又慵懒的小白鼠,它最擅长的就是走各种各样的迷宫.今天它要挑战一个非常大的迷宫,研究员们为了鼓励阿尔吉侬尽快到达终点,就在终点放了一块阿尔吉侬最喜欢的奶酪.现在研究员们想 ...
随机推荐
- .net Core使用 MongoDB
1.安装mogodb windows版本下载地址:https://www.mongodb.com/download-center/v2/community 查看mongod.conf文件,找到绑定的I ...
- MySQL group_concat 介绍
在做数据初始化的时候,由于需要修改满足条件的全部订单的状态,因此,想使用group_concat函数提取满足条件的所有订单id,以方便写回滚脚本.测试数据取自表test1,表结构和相关 insert ...
- CF1217B
CF1217B 题意: 有一个有 $ x $ 个头的龙,你有 $ n $ 种方案,每种方案中包含你可以砍掉的头 $ d_i $ 和龙会生长的头 $ h_i $ 找到一种方案,使得操作数最少. 解法: ...
- ubuntu 安装go
sudo apt install golang-go
- flask中用类的方式构造视图函数
from flask import Flask from flask.views import MethodView app = Flask(__name__) class IndexView(Met ...
- Java并发指南4:Java中的锁 Lock和synchronized
Java中的锁机制及Lock类 锁的释放-获取建立的happens before 关系 锁是java并发编程中最重要的同步机制.锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消 ...
- 第04组 Beta冲刺(1)
队名:斗地组 组长博客:地址 作业博客:Beta冲刺(1/4) 各组员情况 林涛(组长) 过去两天完成了哪些任务: 1.分配展示任务 2.收集各个组员的进度 3.写博客 展示GitHub当日代码/文档 ...
- spring boot 原理解析一(spring boot 基础特征)
spring boot 提供了完整的介绍 文档:https://docs.spring.io/spring-boot/docs/2.2.2.RELEASE/reference/html/documen ...
- rc.local 注意事項,call python script, file position
如果要在 rc.local 呼叫 python script python script 的位置需使用絕對路徑 其 python script 裡的有關 file 的位置也需使用 絕對路徑 如果要在 ...
- linux系统下的rz、sz详解
对于linux服务器来说,通常我们是通过一些ssh工具进行远程访问连接的,而对于经常使用它的人来说,少不了将文件上传下载到服务器.如何能够快速的同服务器进行文件的交互尤为重要.不然每次都打开单独的ss ...