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,结果特判时出错,逗了好长时间 看别人的代码简直是受罪,还好自己终于发现自己代码的小 ...
随机推荐
- 在Xcode4中给程序提供命令行参数(转)
网上xcode4的资料实在是不多,再加上xcode4相对3的改动还那么大,并且还只有英文版.我为了这个问题头痛了很久.后来终于找到了...方法如下 xcode菜单的Product->EditSc ...
- Mobile开发之meta篇
Mobile开发之meta篇 <meta name="viewport" content="width=device-width, initial-scale=1, ...
- python split()黑魔法
split()用法: #!/usr/bin/python str = "Line1-abcdef \nLine2-abc \nLine4-abcd"; print str.spli ...
- 30多条mysql数据库优化方法【转】
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
- highcharts实例教程二:结合php与mysql生成饼图
上回我们分析了用highcharts结合php和mysql生成折线图的实例,这次我们以技术cto网站搜索引擎流量为例利用highcharts生成饼图. 饼图通常用在我们需要直观地显示各个部分所占的比例 ...
- yii 验证确认密码是否一致 【"compare",'compareAttribute'=>'password'】
array("surepassword","compare",'compareAttribute'=>'password','message'=>' ...
- uboot总结:uboot配置和启动过程2(mkconfig分析)
说明:文件位置:在uboot的目录下,文件名为:mkconfig.本身是一个脚本文件. 它的主要作用的是: (1)创建一个重要的符号链接 (2)创建一个config.mk文件(在include目录下) ...
- AdminLTE
AdminLTE搭建前端 0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp ...
- Hadoop完全分布式集群安装
转载请注明原地址,谢谢! 本文目的是教大家配置Hadoop的完全分布式的集群,除了完全分布式还有两种分别是单节点和伪分布式部署.伪分布式只需要一台虚拟机,配置的东西也相对较少,大多用作代码调试,大家稍 ...
- Mysql中类似于nvl()函数的ifnull()函数
IFNULL(expr1,expr2) 如果expr1不是NULL,IFNULL()返回expr1,否则它返回expr2.IFNULL()返回一个数字或字符串值,取决于它被使用的上下文环境. mysq ...