这道题做了很长时间,一开始上课的时候手写代码,所以想到了很多细节,但是创客手打代码的时候由于疏忽又未将pair赋初值,导致一直输出错误,以后自己写代码可以专心一点,可能会在宿舍图书馆或者Myhome,创客晚上好吵呀,隔壁真的服...

  本题大意:给定两个杯子的容量,有六种操作,通过操作使得两个被子其中一个杯子的水等于待输入值C,并输出最少操作次数和操作名称。

  本题思路:BFS,遇到合适的直接输出,搜完都没有搜到就impossible。

  参考代码:

  将switch改为if能节省大部分篇幅,但是switch更美观明了一点。

 #include <string>
#include <cstring>
#include <iostream>
#include <queue>
#include <stack>
using namespace std; typedef pair<int ,int > P;
const int maxn = + , INF = 0x3f3f3f3f;
int A, B, C, t; struct {
int x, y, cnt;//用来存他爹的坐标和倒水的方式
} Ans[maxn][maxn];
int vis[maxn][maxn];
string ans[] = {
"FILL(1)", "FILL(2)", "DROP(1)", "DROP(2)", "POUR(1,2)", "POUR(2,1)",
}; void bfs() {
queue <P> Q;
vis[][] = ;
Ans[][].x = -, Ans[][].y = -;
Q.push(make_pair(, ));
while(!Q.empty()) {
P now = Q.front(), Next;
stack <string> s1;
Q.pop();
if(now.first == C || now.second == C) {
cout << vis[now.first][now.second] << endl;
int X = now.first;
int Y = now.second;
while(X != -) {
s1.push(ans[Ans[X][Y].cnt]);
int tmp = X;
X = Ans[X][Y].x;
Y = Ans[tmp][Y].y;
}
s1.pop();
while(!s1.empty()) {
cout << s1.top() << endl;
s1.pop();
}
return;
}
for(int i = ; i < ; i ++) {
switch(i) {
case ://将A加满
Next.first = A;
Next.second = now.second;
break;
case ://将B加满
Next.second = B;
Next.first = now.first;
break;
case ://将A倒掉
Next.second = now.second;
Next.first = ;
break;
case ://将B倒掉
Next.first = now.first;
Next.second = ;
break;
case ://将A倒入B中
t = B - now.second;//B中还能倒入的量
Next.first = now.first - t;
if(Next.first < ) Next.first = ;
Next.second = now.first + now.second;
if(Next.second > B) Next.second = B;
break;
case ://将B倒入A中
t = A - now.first;//A中还能倒入的量
Next.second = now.second - t;
if(Next.second < ) Next.second = ;
Next.first = now.first + now.second;
if(Next.first > A) Next.first = A;
break;
}
if(vis[Next.first][Next.second] == INF) {
vis[Next.first][Next.second] = vis[now.first][now.second] + ;
Q.push(Next);
Ans[Next.first][Next.second].x = now.first;
Ans[Next.first][Next.second].y = now.second;
Ans[Next.first][Next.second].cnt = i;
}
}
}
cout << "impossible" << endl;
} int main () {
memset(vis, INF, sizeof(vis));
cin >> A >> B >> C;
bfs();
return ;
}

POJ-3414.Pots.(BFS + 路径打印)的更多相关文章

  1. POJ 3414 Pots ( BFS , 打印路径 )

    题意: 给你两个空瓶子,只有三种操作 一.把一个瓶子灌满 二.把一个瓶子清空 三.把一个瓶子里面的水灌到另一个瓶子里面去(倒满之后要是还存在水那就依然在那个瓶子里面,或者被灌的瓶子有可能没满) 思路: ...

  2. POJ 3414 Pots bfs打印方案

    题目: http://poj.org/problem?id=3414 很好玩的一个题.关键是又16ms 1A了,没有debug的日子才是好日子.. #include <stdio.h> # ...

  3. poj 3414 Pots(bfs+输出路径)

    Description You are given two pots, having the volume of A and B liters respectively. The following ...

  4. POJ 3414 Pots 记录路径的广搜

    Description You are given two pots, having the volume of A and B liters respectively. The following ...

  5. POJ 3414 Pots(BFS)

    Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Description You are g ...

  6. POJ - 3414 Pots BFS(著名倒水问题升级版)

    Pots You are given two pots, having the volume of A and B liters respectively. The following operati ...

  7. POJ 3414 Pots (BFS/DFS)

    Pots Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7783   Accepted: 3261   Special Ju ...

  8. poj 3414 Pots bfs+模拟

    #include<iostream> #include<cstring> #define fillA 1 #define pourAB 2 #define dropA 3 #d ...

  9. poj 3414 Pots 【BFS+记录路径 】

    //yy:昨天看着这题突然有点懵,不知道怎么记录路径,然后交给房教了,,,然后默默去写另一个bfs,想清楚思路后花了半小时写了120+行的代码然后出现奇葩的CE,看完FAQ改了之后又WA了.然后第一次 ...

随机推荐

  1. kubernetes下安装mysql

    参考文档:https://blog.csdn.net/sealir/article/details/81177747 注:有mysql安装在k8s集群内,集群外且通过k8s service endpo ...

  2. 【ASP.NET 进阶】仿百度文库文档在线预览(支持格式.pdf,.doc,docx,xls,xlsx,.ppt,pptx)

    在[ASP.NET]PDF文件在线预览(类似百度文库)基础上进行了office文件到pdf文件的转换,然后在显示出来,效果如下: 问题说明: 1.请通过以下方式添加 Office COM 组件. 2. ...

  3. linux 组管理

    修改文件所有者 chown  用户名  文件名 修改文件所在的组 chgrp  组名    文件名 r = 4 , w = 2, x = 2 u  :所有者   g :所在组   o:其他组   a: ...

  4. delphi java 日期 转换 获取Unix时间戳

    获取Unix时间戳 http://www.cnblogs.com/findumars/p/4716753.html 最简单准确一句话 Result:=IntToStr(  DateTimeToUnix ...

  5. java-部分精选面试题

    JVM的类加载机制是什么?有哪些实现方式? 类加载机制: 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法去内,然后在堆区创建一个java.lang.Clas ...

  6. Object-c @property与@synthesize的配对使用。

    功能:让编译器自动编写一个与数据成员同名的方法声明来省去读写方法的声明. 如: 1.在头文件中: @property int count; 等效于在头文件中声明2个方法: - (int)count; ...

  7. linux 自定义模块来缓存skb的意义

    linux中,管理网卡收发报文的结构是sk_buff,这个结构比freebsd中的m_buf复杂的多,这个也是为什么现在用户态协议栈大多采用bsd为基础来实现的一个原因. struct sk_buff ...

  8. ReactiveX 学习笔记(6)条件操作符

    Conditional and Boolean Operators 本文的主题为处理 Observable 的条件和布尔操作符. 这里的 Observable 实质上是可观察的数据流. RxJava操 ...

  9. 动态修改属性设置 easyUI

    if(条件){  $("#area").combobox({ required:false }); }else{ $("#area").combobox({ r ...

  10. eclipse调试快捷键

    Eclipse中有如下一些和运行调试相关的快捷键. 1. [Ctrl+Shift+B]:在当前行设置断点或取消设置的断点.    2. [F11]:调试最后一次执行的程序.    3. [Ctrl+F ...