题目链接:http://poj.org/problem?id=3414

题意:给你两个容器 A  B 问是否能够经过有限的步骤倒水,得到容量为 C 的水,输出最小的步数,同时输出每一步的操作。如果不能达到目标状态,则输出  impossible。

分析:这题跟hdu1495一样,需要分情况考虑,不过这里回溯输出路径。。。

具体分析情况看这里:http://www.tuicool.com/articles/fqeI3i

#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstdlib>
#include <stack>
#include <vector>
#include <set>
#include <map>
#define LL long long
#define mod 1000000007
#define inf 0x3f3f3f3f
#define N 100010
using namespace std;
int a,b,c;
int ok,vis[][];
struct node
{
int x,y;
int step;
};
struct point
{
int x,y,op;
}pre[][];
node make_node(int a,int b,int c)
{
node temp;
temp.x=a;temp.y=b;temp.step=c;
return temp;
}
void path(int x,int y)
{
if(x+y==)
{
return ;
}
path(pre[x][y].x,pre[x][y].y);
if(pre[x][y].op==)
{
printf("FILL(1)\n");
return;
}
if(pre[x][y].op==)
{
printf("FILL(2)\n");
return;
}
if(pre[x][y].op==)
{
printf("DROP(1)\n");
return;
}
if(pre[x][y].op==)
{
printf("DROP(2)\n");
return;
}
if(pre[x][y].op==)
{
printf("POUR(2,1)\n");
return;
}
if(pre[x][y].op==)
{
printf("POUR(1,2)\n");
return;
}
}
void bfs()
{
queue<node>que;
while(!que.empty())que.pop();
memset(vis,,sizeof(vis));
memset(pre,,sizeof(pre));
node cur,nxt;
vis[][]=;
que.push(make_node(,,));
while(!que.empty())
{
cur=que.front();que.pop();
if(cur.x==c||cur.y==c)
{
printf("%d\n",cur.step);
path(cur.x,cur.y);ok=;
return;
}//printf("%d %d\n",cur.x,cur.y);
if(!vis[a][cur.y])
{
vis[a][cur.y]=;
pre[a][cur.y].x=cur.x;
pre[a][cur.y].y=cur.y;
pre[a][cur.y].op=;
que.push(make_node(a,cur.y,cur.step+));
}
if(!vis[cur.x][b])
{
vis[cur.x][b]=;
pre[cur.x][b].x=cur.x;
pre[cur.x][b].y=cur.y;
pre[cur.x][b].op=;
que.push(make_node(cur.x,b,cur.step+));
}
if(!vis[][cur.y])
{
vis[][cur.y]=;
pre[][cur.y].x=cur.x;
pre[][cur.y].y=cur.y;
pre[][cur.y].op=;
que.push(make_node(,cur.y,cur.step+));
}
if(!vis[cur.x][])
{
vis[cur.x][]=;
pre[cur.x][].x=cur.x;
pre[cur.x][].y=cur.y;
pre[cur.x][].op=;
que.push(make_node(cur.x,,cur.step+));
}
if(cur.x+cur.y<=a)
{
int xx=cur.x+cur.y,yy=;
if(!vis[xx][yy])
{
vis[xx][yy]=;
pre[xx][yy].x=cur.x;
pre[xx][yy].y=cur.y;
pre[xx][yy].op=;
que.push(make_node(xx,yy,cur.step+));
}
}
else
{
int xx=a,yy=cur.x+cur.y-a;
if(!vis[xx][yy])
{
vis[xx][yy]=;
pre[xx][yy].x=cur.x;
pre[xx][yy].y=cur.y;
pre[xx][yy].op=;
que.push(make_node(xx,yy,cur.step+));
}
}
if(cur.x+cur.y<=b)
{
int xx=,yy=cur.x+cur.y;
if(!vis[xx][yy])
{
vis[xx][yy]=;
pre[xx][yy].x=cur.x;
pre[xx][yy].y=cur.y;
pre[xx][yy].op=;
que.push(make_node(xx,yy,cur.step+));
}
}
else
{
int xx=cur.x+cur.y-b,yy=b;
if(!vis[xx][yy])
{
vis[xx][yy]=;
pre[xx][yy].x=cur.x;
pre[xx][yy].y=cur.y;
pre[xx][yy].op=;
que.push(make_node(xx,yy,cur.step+));
}
}
}
}
int main()
{
while(scanf("%d%d%d",&a,&b,&c)>)
{
ok=;
bfs();
if(ok==)puts("impossible");
}
}

poj3414(bfs)的更多相关文章

  1. 深搜(DFS)广搜(BFS)详解

    图的深搜与广搜 一.介绍: p { margin-bottom: 0.25cm; direction: ltr; line-height: 120%; text-align: justify; orp ...

  2. 【算法导论】图的广度优先搜索遍历(BFS)

    图的存储方法:邻接矩阵.邻接表 例如:有一个图如下所示(该图也作为程序的实例): 则上图用邻接矩阵可以表示为: 用邻接表可以表示如下: 邻接矩阵可以很容易的用二维数组表示,下面主要看看怎样构成邻接表: ...

  3. 深度优先搜索(DFS)与广度优先搜索(BFS)的Java实现

    1.基础部分 在图中实现最基本的操作之一就是搜索从一个指定顶点可以到达哪些顶点,比如从武汉出发的高铁可以到达哪些城市,一些城市可以直达,一些城市不能直达.现在有一份全国高铁模拟图,要从某个城市(顶点) ...

  4. 【BZOJ5492】[HNOI2019]校园旅行(bfs)

    [HNOI2019]校园旅行(bfs) 题面 洛谷 题解 首先考虑暴力做法怎么做. 把所有可行的二元组全部丢进队列里,每次两个点分别向两侧拓展一个同色点,然后更新可行的情况. 这样子的复杂度是\(O( ...

  5. 深度优先搜索(DFS)和广度优先搜索(BFS)

    深度优先搜索(DFS) 广度优先搜索(BFS) 1.介绍 广度优先搜索(BFS)是图的另一种遍历方式,与DFS相对,是以广度优先进行搜索.简言之就是先访问图的顶点,然后广度优先访问其邻接点,然后再依次 ...

  6. 图的 储存 深度优先(DFS)广度优先(BFS)遍历

    图遍历的概念: 从图中某顶点出发访遍图中每个顶点,且每个顶点仅访问一次,此过程称为图的遍历(Traversing Graph).图的遍历算法是求解图的连通性问题.拓扑排序和求关键路径等算法的基础.图的 ...

  7. 数据结构与算法之PHP用邻接表、邻接矩阵实现图的广度优先遍历(BFS)

    一.基本思想 1)从图中的某个顶点V出发访问并记录: 2)依次访问V的所有邻接顶点: 3)分别从这些邻接点出发,依次访问它们的未被访问过的邻接点,直到图中所有已被访问过的顶点的邻接点都被访问到. 4) ...

  8. 层层递进——宽度优先搜索(BFS)

    问题引入 我们接着上次“解救小哈”的问题继续探索,不过这次是用宽度优先搜索(BFS). 注:问题来源可以点击这里 http://www.cnblogs.com/OctoptusLian/p/74296 ...

  9. HDU.2612 Find a way (BFS)

    HDU.2612 Find a way (BFS) 题意分析 圣诞节要到了,坤神和瑞瑞这对基佬想一起去召唤师大峡谷开开车.百度地图一下,发现周围的召唤师大峡谷还不少,这对基佬纠结着,该去哪一个...坤 ...

随机推荐

  1. kali之ARP欺骗获取图片流

    其实很简单,就两步: 1. 后接三个参数: 网卡:eth0    网关:10.0.0.1    攻击目标:10.0.0.128 2.启动监听 会弹出一个框 里面就会显示攻击目标通过浏览器访问的页面上的 ...

  2. Codility上的问题 (17) PI 2012

    这个题比较简单,给定一个整数数组,对每个元素,求出和它最近比它大的数的距离(下标绝对值),如果没有比它大的数,认为距离是0. 数组元素个数 N [0..50000],数组元素范围[-10^9, +10 ...

  3. HDU2795 Billboard 【线段树】+【单点更新】

    Billboard Time Limit: 20000/8000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  4. pygame编写贪吃蛇

    一直想用pygame做一个小游戏的,可是因为拖延症的缘故一直没有动,结果那天看到了一个12岁的国际友人小盆友用pygame做的一款塔防游戏,突然感觉已经落后超级远了,所以心血来潮做小游戏了.高中陪伴我 ...

  5. jquery用div模拟一个下拉列表框

    原文 jquery用div模拟一个下拉列表框 今天分享一个用我自己用jquery写的,用div模拟下拉列表select,这个效果网上有很多,但是写一个有自己思路的代码效果,更有成就感,先看截图: 自我 ...

  6. 14.1.2 Checking InnoDB Availability 检查InnoDB 可用性:

    14.1.2 Checking InnoDB Availability 检查InnoDB 可用性: 确认你的server 是否支持InnoDB,使用 SHOW ENGINES 语句.(默认MySQL的 ...

  7. 基于visual Studio2013解决面试题之0407数组差

     题目

  8. JavaScript快速入门(三)——JavaScript语句

    JavaScript基本语句 基本概述 JavaScript是脚本语言,从上到下解释执行,最小单位为语句或语句块,每个语句以分号结尾,每个语句块以右大括号结尾. JavaScript可以将多条语句或语 ...

  9. 编译android-4.3.1_r源代码并刷到自己的Galaxy Nexus I9250真机上

    编译android-4.3.1_r源代码并刷到自己的Galaxy Nexus I9250真机上 作者:雨水  日期:2014-04-30 编译源码的目的还是为了自己改动源码,然后还可以执行在相应的手机 ...

  10. sql server 2005 外围应用配置器

    想要实现sql server 2005 远程连接数据库,我们必需要用到sql05上自带的外围配置器,以下是对它的一些配置上的介绍: 首先我们要打开sql05外围配置器,例如以下图: 打开后,我们如今就 ...