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】献给阿尔吉侬的花束
[题目描述] 阿尔吉侬是一只聪明又慵懒的小白鼠,它最擅长的就是走各种各样的迷宫.今天它要挑战一个非常大的迷宫,研究员们为了鼓励阿尔吉侬尽快到达终点,就在终点放了一块阿尔吉侬最喜欢的奶酪.现在研究员们想 ...
随机推荐
- Tomcat部署时war和war exploded区别以及如何实现热部署
war和war exploded的区别 使用IDEA配置Tomcat服务的时候,在 Select Artifacts to Deploy 选项中相同项目名有war和 war explode ...
- 软件构造实验二-拷贝一个c文件 将其中的关键字int替换成float
1,新建 Parser Generator 点击project --> new 2,填写工程名字 随意取一个名字 点击OK 3,点击Project选项下的 parserwizard 分析器向导选 ...
- java单例问题
之前看资料,有人根据对象的创建时间将单例的实现分为懒汉式和饿汉式: 懒汉式: public class Singleton { private volatile static Singleton in ...
- Sketch教程
去年夏天开始用Sketch,觉得它放Dock里闪亮亮的很好看,当时笑称是男盆友送我的第一颗小钻石噗哈哈.所以那段时间几乎刷遍了所有关于 Sketch 的网站.文章.教程,之后又在自学设计,因为想和更多 ...
- map初步(由ABBC--->A2BC)
1.题目: Given a string containing only 'A' - 'Z', we could encode it using the following method: 1. Ea ...
- pip 安装的问题
安装 pip install mysql-python 报错: mysql_config: command not found 解决办法: yum install mysql-devel yum ...
- centos7 - nginx配置安装phpmyadmin
原文 https://www.linuxidc.com/Linux/2017-10/147556.htm 使用Nginx搭建phpMyAdmin Nginx有什么用? Nginx可读作Engin ...
- CentOS7下安装php-redis扩展
yum -y install php70w-pecl-redis
- git如何配置邮箱和用户名?
答: 1. 配置邮箱 git config --global user.email "jello_smith@163.com" 2. 配置用户名 git config --glob ...
- flask的post,get请求及获取不同格式的参数
flask的post,get请求及获取不同格式的参数 1 获取不同格式参数 1.0 获取json参数 Demo from flask import Flask, request, jsonify ap ...