POJ 3414 Pots ( BFS , 打印路径 )
题意:
给你两个空瓶子,只有三种操作
一、把一个瓶子灌满
二、把一个瓶子清空
三、把一个瓶子里面的水灌到另一个瓶子里面去(倒满之后要是还存在水那就依然在那个瓶子里面,或者被灌的瓶子有可能没满)
思路:BFS,打印路径时需技巧。
//G++ 840K 0MS
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <stack>
#include <queue>
#include <cmath>
#include <map>
#include <vector>
#include <algorithm>
#define MIN(A,B) ((A)<(B)?(A):(B))
#define DEBUG puts("Hello world!");
#define N 110
using namespace std ; bool visit[N][N] ; struct node
{
int x , y ;
int step ;
}pos , next ; struct way
{
int x , y ;
int stept ;
}before[N][N] ; void
Print_Path ( int x , int y )
{
stack<int>st ;
while ( x != 0 || y != 0 )
{
st.push ( before[x][y].stept ) ;
int temp_x , temp_y ;
temp_x = before[x][y].x ;
temp_y = before[x][y].y ;
x = temp_x ;
y = temp_y ;
}
while ( !st.empty() )
{
switch ( st.top() )
{
case 1:
printf("DROP(1)\n");
break;
case 2:
printf("DROP(2)\n");
break;
case 3:printf("FILL(1)\n");
break;
case 4:printf("FILL(2)\n");
break;
case 5:printf("POUR(1,2)\n");
break;
case 6:printf("POUR(2,1)\n");
break;
}
st.pop ( ) ;
}
return ;
} void
Modify ( node * const p , int const x , int const y , int const step )
{
p->x = x ;
p->y = y ;
p->step = step ;
return ;
} bool
BFS ( int const A , int const B , int const C )
{
queue <node>q ;
next.x = 0 ;
next.y = 0 ;
next.step = 0 ;
visit[0][0] = true ;
q.push(next) ;
while ( !q.empty( ) )
{
pos = q.front ( ) ;
q.pop ( ) ;
if ( C == pos.x || C == pos.y )
{
printf ("%d\n" ,pos.step ) ;
Print_Path ( pos.x , pos.y ) ;
//DEBUG
return true ;
}
if ( !visit[0][pos.y] && 0 != pos.x ) //case 1 : DROP(1)
{
Modify ( & next , 0 , pos.y , pos.step + 1 ) ;
q.push ( next ) ;
visit[0][pos.y] = true ;
before[0][pos.y] = ( struct way ) { pos.x , pos.y,1 } ;
}
if ( !visit[pos.x][0] && 0 != pos.y ) //case 2 : DROP(2)
{
Modify ( & next , pos.x , 0 , pos.step + 1 ) ;
q.push ( next ) ;
visit[pos.x][0] = true ;
before[pos.x][0] = ( struct way ) { pos.x , pos.y , 2 } ;
}
if ( !visit[A][pos.y] && A != pos.x ) //case 3 : FILL(1)
{
Modify ( & next , A , pos.y , pos.step + 1 ) ;
q.push ( next ) ;
visit[A][pos.y] = true ;
before[A][pos.y] = ( struct way ) { pos.x , pos.y , 3 } ;
}
if ( !visit[pos.x][B] && B != pos.y ) //case 4 : FILL(2)
{
Modify ( & next , pos.x , B , pos.step + 1 ) ;
q.push ( next ) ;
visit[next.x][next.y] = true ;
before[pos.x][B] = ( struct way ) { pos.x , pos.y , 4 } ;
}
if ( pos.x > 0 && pos.y < B ) //case 5 : POUR(1,2)
{
int temp ;
temp = MIN ( pos.x , B - pos.y ) ;
if ( !visit[pos.x-temp][pos.y+temp] )
{
Modify ( & next , pos.x - temp , pos.y + temp , pos.step + 1 ) ;
q.push ( next ) ;
visit[next.x][next.y] = true ;
before[next.x][next.y] = ( struct way ) {pos.x , pos.y,5} ;
}
}
if ( pos.x < A && pos.y > 0 ) //case 6: POUR(2,1)
{
int temp ;
temp = MIN ( pos.y , A - pos.x ) ;
if ( !visit[pos.x+temp][pos.y-temp] )
{
Modify ( & next , pos.x + temp , pos.y - temp , pos.step + 1 ) ;
q.push ( next ) ;
visit[next.x][next.y] = true ;
before[next.x][next.y] = (struct way ){pos.x , pos.y , 6} ;
}
}
}
return false ;
} int
main ( )
{
int A ,B , C ;
while ( EOF != scanf ("%d%d%d" , & A , & B , & C ) )
{
if ( !BFS ( A , B , C ) )
{
printf ("impossible\n") ;
}
memset ( visit , 0 , sizeof ( visit ) ) ;
}
return 0 ;
}
POJ 3414 Pots ( BFS , 打印路径 )的更多相关文章
- POJ 3414 Pots bfs打印方案
题目: http://poj.org/problem?id=3414 很好玩的一个题.关键是又16ms 1A了,没有debug的日子才是好日子.. #include <stdio.h> # ...
- poj 3414 Pots(bfs+输出路径)
Description You are given two pots, having the volume of A and B liters respectively. The following ...
- POJ 3414 Pots(BFS)
Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu Description You are g ...
- POJ - 3414 Pots BFS(著名倒水问题升级版)
Pots You are given two pots, having the volume of A and B liters respectively. The following operati ...
- POJ 3414 Pots (BFS/DFS)
Pots Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7783 Accepted: 3261 Special Ju ...
- poj 3414 Pots bfs+模拟
#include<iostream> #include<cstring> #define fillA 1 #define pourAB 2 #define dropA 3 #d ...
- poj 3414 Pots 【BFS+记录路径 】
//yy:昨天看着这题突然有点懵,不知道怎么记录路径,然后交给房教了,,,然后默默去写另一个bfs,想清楚思路后花了半小时写了120+行的代码然后出现奇葩的CE,看完FAQ改了之后又WA了.然后第一次 ...
- 广搜+输出路径 POJ 3414 Pots
POJ 3414 Pots Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13547 Accepted: 5718 ...
- BFS POJ 3414 Pots
题目传送门 /* BFS:六种情况讨论一下,BFS轻松解决 起初我看有人用DFS,我写了一遍,TLE..还是用BFS,结果特判时出错,逗了好长时间 看别人的代码简直是受罪,还好自己终于发现自己代码的小 ...
随机推荐
- 最优雅的C++跟lua交互.
我先来吐槽一下我们这个项目. 我是做手机游戏的, cocos2dx引擎, lua编码. 这本来是一件很欢快的事情, 因为不用接触C++. C++写久了的人写lua, 就会感觉任督二脉被打通了, 代码写 ...
- 装了SVN,你的关联图标变了没有?
装了SVN,你的关联图标变了没有? 开始合作之后,装上了SVN,非常高效,我在VS写了一部分的代码,上传之后,别人通过下载或是更新,就更新到了合作同伴的VS里,相当于大家在一个VS里写代码.和保强他们 ...
- Ubuntu 12.04 下安装配置 JDK 7(tar)
第一步:下载jdk-7u45-linux-i586.tar.gz 到Orcale的JDK官网下载JDK7的tar包 第二步:解压安装 tar -zxvf ./jdk-7u45-linux-i586.t ...
- python运维开发之路第一天
一.python安装及环境变量配置 1.windows7安装python 1)下载地址:https://www.python.org/downloads/windows/ 如下图: 注意:下载,用代理 ...
- linux下svn客户端报错Cannot negotiate authentication mechanism的解决方法
svn客户端报错Cannot negotiate authentication mechanism的解决方法: 问题出现的原因之一: 因为SVN服务器配置了saslauthd服务用来实现与ldap的对 ...
- HDU 1207
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1207 四柱汉诺塔问题 当 r = (sqrt(8*n+1)-1)/2 时, 存在 count = (n ...
- Kendo UI for Angular 2 控件
Kendo UI for Angular 2 控件 伴随着 Angular 2 的正式 release,Kendo UI for Angular 2 的第一批控件已经发布了,当前是 Beta 版本,免 ...
- 纯Html+Ajax和JSP两者的优缺点
我对jsp和ajax 一直比较困惑, jsp动态网页技术,在服务器端执行,能在网页中显示数据这是一种方式 .另一种方式是我打开一个网页(html),加载完成之后,使用js,ajax访问网络得到json ...
- O-C浮点数转化整数
1.简单粗暴,直接转化 float f = 1.5; int a; a = (int)f; NSLog("a = %d",a); 输出结果是1.(int)是强制类型转化,丢弃浮点数 ...
- 关于ueditor1.4.3版复制section标签丢失class和style样式问题
在复制微信的文章格式到ueditor时发现section标签中的style和class属性丢失,严重影响美观. 原文格式,排版清晰段落分明赏心悦目: 复制到ueditor后的格式...这跟原文是没法比 ...