poj3414(bfs)
题目链接: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)的更多相关文章
- 深搜(DFS)广搜(BFS)详解
图的深搜与广搜 一.介绍: p { margin-bottom: 0.25cm; direction: ltr; line-height: 120%; text-align: justify; orp ...
- 【算法导论】图的广度优先搜索遍历(BFS)
图的存储方法:邻接矩阵.邻接表 例如:有一个图如下所示(该图也作为程序的实例): 则上图用邻接矩阵可以表示为: 用邻接表可以表示如下: 邻接矩阵可以很容易的用二维数组表示,下面主要看看怎样构成邻接表: ...
- 深度优先搜索(DFS)与广度优先搜索(BFS)的Java实现
1.基础部分 在图中实现最基本的操作之一就是搜索从一个指定顶点可以到达哪些顶点,比如从武汉出发的高铁可以到达哪些城市,一些城市可以直达,一些城市不能直达.现在有一份全国高铁模拟图,要从某个城市(顶点) ...
- 【BZOJ5492】[HNOI2019]校园旅行(bfs)
[HNOI2019]校园旅行(bfs) 题面 洛谷 题解 首先考虑暴力做法怎么做. 把所有可行的二元组全部丢进队列里,每次两个点分别向两侧拓展一个同色点,然后更新可行的情况. 这样子的复杂度是\(O( ...
- 深度优先搜索(DFS)和广度优先搜索(BFS)
深度优先搜索(DFS) 广度优先搜索(BFS) 1.介绍 广度优先搜索(BFS)是图的另一种遍历方式,与DFS相对,是以广度优先进行搜索.简言之就是先访问图的顶点,然后广度优先访问其邻接点,然后再依次 ...
- 图的 储存 深度优先(DFS)广度优先(BFS)遍历
图遍历的概念: 从图中某顶点出发访遍图中每个顶点,且每个顶点仅访问一次,此过程称为图的遍历(Traversing Graph).图的遍历算法是求解图的连通性问题.拓扑排序和求关键路径等算法的基础.图的 ...
- 数据结构与算法之PHP用邻接表、邻接矩阵实现图的广度优先遍历(BFS)
一.基本思想 1)从图中的某个顶点V出发访问并记录: 2)依次访问V的所有邻接顶点: 3)分别从这些邻接点出发,依次访问它们的未被访问过的邻接点,直到图中所有已被访问过的顶点的邻接点都被访问到. 4) ...
- 层层递进——宽度优先搜索(BFS)
问题引入 我们接着上次“解救小哈”的问题继续探索,不过这次是用宽度优先搜索(BFS). 注:问题来源可以点击这里 http://www.cnblogs.com/OctoptusLian/p/74296 ...
- HDU.2612 Find a way (BFS)
HDU.2612 Find a way (BFS) 题意分析 圣诞节要到了,坤神和瑞瑞这对基佬想一起去召唤师大峡谷开开车.百度地图一下,发现周围的召唤师大峡谷还不少,这对基佬纠结着,该去哪一个...坤 ...
随机推荐
- HDU 3966 Aragorn's Story(树链剖分)
HDU Aragorn's Story 题目链接 树抛入门裸题,这题是区间改动单点查询,于是套树状数组就OK了 代码: #include <cstdio> #include <cst ...
- 怎样在ios开发中设置tableview的cell颜色
//方法一: cell .contentView .backgroundColor = [ UIColor redColor ]; //方法二: UITableViewCell *cell = [ta ...
- c语言, objective code(new 2)
参考: 1. C中的继承和多态 http://www.cnblogs.com/skynet/archive/2010/09/23/1833217.html
- SPSS Modeler数据挖掘项目实战(数据挖掘、建模技术)
SPSS Modeler是业界极为著名的数据挖掘软件,其前身为SPSS Clementine.SPSS Modeler内置丰富的数据挖掘模型,以其强大的挖掘功能和友好的操作习惯,深受用户的喜爱和好评, ...
- PHP移动互联网开发笔记(5)——文件的上传下载
原文地址:http://www.php100.com/html/php/rumen/2014/0326/6706.html 一.文件的上传 1.client设置: (1).在 标签中将enctype和 ...
- 【ASP.NET Web API教程】2.4 创建Web API的帮助页面
原文:[ASP.NET Web API教程]2.4 创建Web API的帮助页面 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本博客文章,请先看前面的内容. 2.4 ...
- javascript中apply和eval结合的强大用法
eval是一个函数,可以接受一个参数,这个参数可以作为js语句被解释性的执行,利用这个特性,eval和apply结合起来,可以大大简化代码 如下例子 <a class="cl ...
- Swift - whose view is not in the window hierarchy 问题解决方法
问题现象:想在页面初始化的时候,使用self.presentViewController方法弹出个告警提示框UIAlertController.但行后报了个如下告警,同时告警框也出不来. 1 2015 ...
- TPL异步并行编程之回调
Task是基于ThreadPool线程池基础上的高度异步多线程编程,如果有一天我希望一个需要长时间运行的Task,在被某些异常终止后还能回调一些代码就可以知道Task终止的原因了吧 是的,且看代码 p ...
- javascript中外部js文件取得自身完整路径得办法
原文:javascript中外部js文件取得自身完整路径得办法 有时候我们需要引入一个外部js文件,这个js文件又需要用到自己的路径或者是所在的目录,别问怎么又这么变态的需求,开发做久了各种奇葩需求也 ...