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++类型萃取的编写技巧
废话不多说,上来贴代码最实在,哈哈! 以下代码量有点多,不过这都是在下一手一手敲出来的,小巧好用,把以下代码复制出来,放到相应的hpp文件即可,VS,GCC下均能编译通过 #include<io ...
- 微软SQLHelper.cs类
using System; using System.Data; using System.Xml; using System.Data.SqlClient; using System.Collect ...
- 【HDU4348】【主席树】To the moon
Problem Description BackgroundTo The Moon is a independent game released in November 2011, it is a r ...
- js获取url中的参数对象、js生成带参数的url
// 获取url中的参数,并返回一个对象 $.getRequestData = function() { var url = location.search; //获取url中"?" ...
- Magento 2.0 安装
环境: 直接升到最新版PHP5.6.x 刚才开MAC OS PHP 5.5 CENTOS PHP 5.5 composer install 依懒包错误.反复安装组件.还是不行.后来决定重新编释最 ...
- PHP面向对象(OOP):__set(),__get(),__isset(),__unset()四个方法的应用
一般来说,总是把类的属性定义为private,这更符合现实的逻辑.但是, 对属性的读取和赋值操作是非常频繁的,因此在PHP5中,预定义了两个函数”__get()”和”__set()”来获取和赋值其属性 ...
- 理解CSS Clip属性及用法
应用Clip属性实现的一个简单效果图: 样式写法: .my-element { position: absolute; clip: rect(10px 350px 170px 0); /* IE ...
- linux c数据库备份第一版
使用linuxC实现的mysql数据库备份目标:通过alarm信号定时备份数据库备注:目前是第一个版,本身不能定时备份可以结合linux自动化实现定时备份.运行平台:Linux或类unix测试平台:u ...
- bzoj2096: [Poi2010]Pilots
Description Tz又耍畸形了!!他要当飞行员,他拿到了一个飞行员测试难度序列,他设定了一个难度差的最大值,在序列中他想找到一个最长的子串,任意两个难度差不会超过他设定的最大值.耍畸形一个人是 ...
- OC-深浅复制
[OC学习-26]对象的浅拷贝和深拷贝——关键在于属性是否可被拷贝 对象的拷贝分为浅拷贝和深拷贝, 浅拷贝就是只拷贝对象,但是属性不拷贝,拷贝出来的对象和原来的对象共用属性,即指向同一个属性地址. 深 ...