题目链接: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. Jquery文本框小例(必填框)

    <script src="../JavaScript/jquery-2.0.2.min.js"></script> <script type=&quo ...

  2. axure母版(模板)区域介绍

    axure的模板区域是非常重要的一个功能,网站的头部.尾部部分等很多页面同时用到的内容,都可以使用母版,因为在母版中只需要修改一次,就可以实现所有的页面更新,可以大大的加速原型的制作速度.需要重复理解 ...

  3. Duanxx的C++学习: 使用类没有被定义 原因及解决方法

    今天,随着C++写的神经网络算法.我发现了一个很令人费解的问题,下面的描述一般地描述,例如: 我有两个类ClassA和ClassB,它们分别有成员变量a.b; ClassA有一个函数是这种:Funct ...

  4. Swift - 多线程实现方式(1) - NSThread

    1,Swift继续使用Object-C原有的一套线程,包括三种多线程编程技术: (1)NSThread (2)Cocoa NSOperation(NSOperation和NSOperationQueu ...

  5. CodeForce 439C Devu and Partitioning of the Array(模拟)

     Devu and Partitioning of the Array time limit per test 1 second memory limit per test 256 megabytes ...

  6. 在命令行获取标准输入序列的反互序列,pep序列和长度信息

    近期对序列文件处理的比較多,时常要看一些核酸序列的反向互补序列,长度.可能的翻译序列. 曾经我常用seqBuider 来查看.假设能在命令行直接查看.想必是极好的. 这是一个perl脚本.只是我把它的 ...

  7. shell telnet 路由器

    #!/usr/bin/expect -f spawn telnet 172.16.1.80 expect "login" { send "admin\n" ex ...

  8. IE浏览器上传文件时本地路径变成”C:\fakepath\”的问题

    在使用<input id="file_upl" type="file" />控件上传文件时,有时会需要获取文件本地路径展示给客户,这时可以通过这样的 ...

  9. mysql sql执行顺序

    <pre name="code" class="html">mysql> explain select * from (select * fr ...

  10. C#数学运算表达式解释器

    C#数学运算表达式解释器 測试文件内容: a=2+3*2; b=2*(2+3); 浏览按钮事件处理程序: private void button_browse_Click(object sender, ...