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,结果特判时出错,逗了好长时间 看别人的代码简直是受罪,还好自己终于发现自己代码的小 ...
随机推荐
- Android 学习手札(备注)
1.在Android 应用程序中不能使用System.out.println(..)来输出信息,而要使用Log类中的静态方法输出调试信息. Log.d("onStart", &qu ...
- mysql命令行导出导入数据库
一.MYSQL的命令行模式的设置: 桌面->我的电脑->属性->环境变量->新建->PATH=“:path\mysql\bin;”其中path为MYSQL的安装路径.二. ...
- 设置session的生命周期(php)
PHP中,Session变量保存在服务器端(默认以文件格式保存),而Session ID以cookie形式保存在客户端. 销毁session的方法有2种 第一种是通过程序 session_destor ...
- phpcms 如何获取文章
请求地址http://127.0.0.1/phpcms/index.php?m=content&c=index&a=show&catid=6&id=8 先来判断地址对应 ...
- PHP面向对象(OOP):克隆对象__clone()方法
有的时候我们需要在一个项目里面,使用两个或多个一样的对象,如果你使用“new”关键字重新创建对象的话,再赋值上相同的属性,这样做比较烦琐而且也容易出错,所以要根据一个对象完全克隆出一个一模一样的对象, ...
- JQuery解析XML数据的几个例子
用JavaScript解析XML数据是常见的编程任务,JavaScript能做的,JQuery当然也能做.下面我们来总结几个使用JQuery解析XML的例子. 第一种方案: <script ty ...
- Ubuntu 创建快捷方式的方法
ln -s /要创建快捷方式的地方/ /创建在哪里/
- 项目管理模式——Projects
Github 新的项目管理模式——Projects Github 新的项目管理模式——Projects Issues Github 中传统的项目管理是使用 issue 和 pull request 进 ...
- java学习之负数的进制
在上一篇内容当中说明了什么是进制,进制存在的原因以及形式,接下来说一下一个比较特殊的进制计算,就是负数的在计算机当中的表示.举个个例子来说 6的二进制表示是什么? 0000-0000-0000-000 ...
- 教您怎么从spring 官网下载参考文档
假如您使用spring,那么本经验可能帮助到您. 假如您使用spring的过程中,需要查询一些文档,那么本经验可能帮助到您. 假如您对下载spring的文档有疑惑,那么本经验可能帮助到您. 教您怎么从 ...