POJ-3414.Pots.(BFS + 路径打印)
这道题做了很长时间,一开始上课的时候手写代码,所以想到了很多细节,但是创客手打代码的时候由于疏忽又未将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 + 路径打印)的更多相关文章
- 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 记录路径的广搜
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了.然后第一次 ...
随机推荐
- ssm学习的第一个demo---crm(1)
这是一个普通的CRM项目 (第一步规划好项目设计路线:导入jar包→配置sqlMapConfig.xml(空文件)→配置applicationContext.xml →配置springMVC.xml→ ...
- gulp 添加版本号 解决浏览器缓存问题
分别安装gulp-rev.gulp-rev-collerctor.gulp-asset-rev,安装了的略过 npm install gulp-rev --save-dev npm install g ...
- day07-多表查询
本节重点: 多表连接查询 符合条件连接查询 子查询 准备工作:准备两张表,部门表(department).员工表(employee) create table department( id int, ...
- jquery 基础-记住
jquery最为一个库,简便. 难点在于选择器,筛选器的使用. 属性一般都是,jquery对象.函数(),括号内部添属性. s= '<tr> <td class="fix& ...
- SAFESEH 映像是不安全的
1.打开该项目的“属性页”对话框 2.然后单击“链接器”--“命令行”,出现如下界面 3.将 /SAFESEH:NO 复制到“其它选项(D)”框中,然后点击应用 返回VS2013,重新编译运行程序即可 ...
- BBS-基于forms组件和ajax实现注册功能
http://www.cnblogs.com/yuanchenqi/articles/7638956.html 1.设计注册页面 views.py from django import forms c ...
- JAVA8-待续
1. 函数式编程,因为在并发和时间驱动编程中的优势,函数式编程又逐渐流行起来 以前是实现一个比较器需要实现Comparator接口,并重写compare方法,以下为两种实现方法(类似还有线程,事件等) ...
- js 获取北京时间
<SCRIPT LANGUAGE = "JavaScript"> var xmlhttp = new ActiveXObject("MSXML2.XMLHTT ...
- 【358】GitHub 上面文件夹下载方法
参考:https://www.bilibili.com/read/cv210500/ 参考:https://www.jianshu.com/p/743ecc20ffb2 软件下载:Downloads ...
- UNION 与 UNION ALL的区别
UNION 操作符用于合并两个或多个 SELECT 语句的结果集. 请注意,列的数量.数据类型.顺序要保持一致!!! 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名. 例子: ...