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) 题意分析 圣诞节要到了,坤神和瑞瑞这对基佬想一起去召唤师大峡谷开开车.百度地图一下,发现周围的召唤师大峡谷还不少,这对基佬纠结着,该去哪一个...坤 ...
随机推荐
- [转]java-Three Rules for Effective Exception Handling
主要讲java中处理异常的三个原则: 原文链接:https://today.java.net/pub/a/today/2003/12/04/exceptions.html Exceptions in ...
- http权威指南 telnet
对于winXP 1.先启动一个telnet程序连接到TCP服务器中. telnet www.joes-hardware.com 80 2.在连接上的TCP服务器的telnet程序窗口中同时按下 &qu ...
- 矩形、占位符组件——axure线框图部件库介绍
矩形组件和占位符没有太多的区别,这里我们主要讲解矩形组件的操作和使用,占位符的操作各位可以按照矩形的操作方法进行练习一下. 矩形组件是一个矩形,它可以用来做很多的工作,比如页面上需要一块蓝色的背景,就 ...
- Linkedin工程师是如何优化他们的Java代码的(转)
英文原文:LinkedIn Feed: Faster with Less JVM Garbage 最近在刷各大公司的技术博客的时候,我在Linkedin的技术博客上面发现了一篇很不错博文.这篇博文介绍 ...
- 基于visual Studio2013解决C语言竞赛题之1083人机博弈
题目 解决代码及点评 /************************************************************************/ /* ...
- UVALive 2519 Radar Installation 雷达扫描 区间选点问题
题意:在坐标轴中给出n个岛屿的坐标,以及雷达的扫描距离,要求在y=0线上放尽量少的雷达能够覆盖全部岛屿. 很明显的区间选点问题. 代码: /* * Author: illuz <iilluzen ...
- wifi定位原理
wifi定位和手机基站定位类别似,两者都需要收集wifi位置信息接入点. 其实WIFI奇妙,它靠的是侦測附近周围全部的无线网路基地台 (WiFi Access Point) 的 MAC Address ...
- 【thinking in java】读书笔记(一)
近期開始读tij,好记性不如烂笔头,所以还是记录一下,方便以后查阅. 一.各种初始化问题: 方法重载的问题: 方法的重载,差别是靠传入方法的參数,而不是返回值.比方f(),假设是返回值的话,easy产 ...
- JDBC操作数据库的学习(2)
在上一篇博客<JDBC操作数据库的学习(1)>中通过对例1,我们已经学习了一个Java应用如何在程序中通过JDBC操作数据库的步骤流程,当然我们也说过这样的例子是无法在实际开发中使用的,本 ...
- delphi不同版本字符串类型的演化(要支持基于firemonkey的app调用,字符串最好使用olevariant类型)
string,DELPHI2009以前的版本string=ansistring,一个字符占一个字节,DELPHI2009及以上版本string=unicodestring,一个字符占二个字节. cha ...