【POJ3414】Pots
本题知识点:宽度优先搜素 + 字符串
题意很简单,如何把用两个杯子,装够到第三个杯子的水。
操作有六种,这样就可以当作是bfs的搜索方向了
// FILL(1) 把第一个杯子装满
// FILL(2) 把第二个杯子装满
// POUR(1,2) 把第一个杯子的水倒进第二个杯子
// POUR(2,1) 把第二个杯子的水倒进第一个杯子
// DROP(1) 把第一个杯子的水都倒掉
// DROP(2) 把第二个杯子的水都倒掉
本题的难点是如何记录路径,我们可以用一个巧妙的方法去解决掉,详细请看代码
// POJ 3414
#include<iostream>
#include<cstdio>
#include<string>
#include<queue>
using namespace std;
bool take[102][102], ok;
int A, B, C;
struct node{
string str;
int l, r, pla[102], cnt; // cnt 记录有多少条路径
};
queue<node> que;
string str[] = {
"FILL(1)",
"FILL(2)",
"POUR(1,2)",
"POUR(2,1)",
"DROP(1)",
"DROP(2)"
};
void show(int len, int pla[]){
printf("%d\n", len);
for(int i = 1; i <= len; i++){
cout << str[pla[i]] << endl;
}
}
void bfs(){
ok = false;
take[0][0] = true;
node a;
a.str = "NONE";
a.l = a.r = a.cnt = 0;
que.push(a);
while(!que.empty()){
node next, now = que.front(); que.pop();
// cout << now.str << " ";
// printf("l:%d r:%d cnt:%d\n", now.l, now.r, now.cnt);
// show(now.cnt, now.pla);
// cout << endl;
if(now.l == C || now.r == C){
show(now.cnt, now.pla);
ok = true;
break;
}
// FILL(1)
if(now.l < A && !take[A][now.r]){
next.str = str[0];
next.l = A;
next.r = now.r;
// 这句循环是为了保存之前的路径 下同
for(int i = 1; i <= now.cnt; i++){
next.pla[i] = now.pla[i];
}
next.pla[now.cnt + 1] = 0;
next.cnt = now.cnt + 1;
take[A][now.r] = true;
que.push(next);
}
// FILL(2)
if(now.r < B && !take[now.l][B]){
next.str = str[1];
next.l = now.l;
next.r = B;
for(int i = 1; i <= now.cnt; i++){
next.pla[i] = now.pla[i];
}
next.pla[now.cnt + 1] = 1;
next.cnt = now.cnt + 1;
take[now.l][B] = true;
que.push(next);
}
// POUR(1, 2)
if(0 < now.l && now.r < B){
int R = now.l + now.r >= B ? B : now.l + now.r;
int L = R - now.r >= now.l ? 0 : now.l - (R - now.r);
if(!take[L][R]){
next.str = str[2];
next.l = L;
next.r = R;
for(int i = 1; i <= now.cnt; i++){
next.pla[i] = now.pla[i];
}
next.pla[now.cnt + 1] = 2;
next.cnt = now.cnt + 1;
take[L][R] = true;
que.push(next);
}
}
// POUR(2,1)
if(now.l < A && 0 < now.r){
int L = now.l + now.r >= A ? A : now.l + now.r;
int R = L - now.l >= now.r ? 0 : now.r - (L - now.l);
if(!take[L][R]){
next.str = str[3];
next.l = L;
next.r = R;
for(int i = 1; i <= now.cnt; i++){
next.pla[i] = now.pla[i];
}
next.pla[now.cnt + 1] = 3;
next.cnt = now.cnt + 1;
take[L][R] = true;
que.push(next);
}
}
// DROP(1)
if(!take[0][now.r]){
next.str = str[4];
next.l = 0;
next.r = now.r;
for(int i = 1; i <= now.cnt; i++){
next.pla[i] = now.pla[i];
}
next.cnt = now.cnt + 1;
next.pla[now.cnt + 1] = 4;
take[0][now.r] = true;
que.push(next);
}
// DROP(2)
if(!take[now.l][0]){
next.str = str[5];
next.l = now.l;
next.r = 0;
for(int i = 1; i <= now.cnt; i++){
next.pla[i] = now.pla[i];
}
next.cnt = now.cnt + 1;
next.pla[now.cnt + 1] = 5;
take[now.l][0] = true;
que.push(next);
}
}
if(!ok) printf("impossible\n");
}
int main()
{
scanf("%d %d %d", &A, &B, &C);
bfs();
return 0;
}
【POJ3414】Pots的更多相关文章
- 【BFS】Pots
[poj3414]Pots Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16925 Accepted: 7168 ...
- 【转】ACM训练计划
[转] POJ推荐50题以及ACM训练方案 -- : 转载自 wade_wang 最终编辑 000lzl POJ 推荐50题 第一类 动态规划(至少6题, 和 必做) 和 (可贪心) (稍难) 第二类 ...
- Python高手之路【六】python基础之字符串格式化
Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...
- 【原】谈谈对Objective-C中代理模式的误解
[原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...
- 【原】FMDB源码阅读(三)
[原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...
- 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新
[原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...
- 【调侃】IOC前世今生
前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...
- Python高手之路【三】python基础之函数
基本数据类型补充: set 是一个无序且不重复的元素集合 class set(object): """ set() -> new empty set object ...
- Python高手之路【一】初识python
Python简介 1:Python的创始人 Python (英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种解释型.面向对象.动态数据类型的高级程序设计语言,由荷兰人Guido ...
随机推荐
- Google Chrome 浏览器JS无法更新解决办法
JS无法更新原因: 浏览器为了加载快,默认是按照自定规则更新缓存,非实时更新. 我们在开发的时候,JS变动很快,需要即时让浏览器加载最新文件,也就是禁用浏览器缓存 (1)使用F12进入开发者模式,找到 ...
- APS.NET MVC + EF (02)---深入理解ADO.NET Entity Framework
2.7 深入理解Entity Framework 性能问题几乎是一切ORM框架的通病,对于EF来说,引起性能低的原因主要在以下几个方面. 复杂的对象管理机制为了在.NET中更好地管理模型对象,EF提供 ...
- C# Linq 使用总结
隐式类型匿名类型自动属性初始化器委托泛型泛型委托匿名方法Lambda表达式扩展方法迭代器LINQ System.Linq var arr = new[] { "c", " ...
- CMS-headless or non-headless, page-based or object-based storage?
内容管理系统对于很多在线教育企业来说都是至关重要的,他不仅可以用于内容的创作,编辑,发布,撤销,展示也可以用于运营或者市场产生他们需要的页面. 传统上,Wordpress是一个非常成功的CMS,他将内 ...
- Java自学-异常处理 异常分类
Java 中异常的分类 异常分类: 可查异常,运行时异常和错误3种 其中,运行时异常和错误又叫非可查异常 步骤 1 : 可查异常 可查异常: CheckedException 可查异常即必须进行处理的 ...
- js多个参数(追加参数)
/** * 多个参数 * @param fn * @param args * @param scope */ function multipleArguments(fn,args,scope){ if ...
- CSS3 2D 变换
CSS2D transform 表示2D变换,目前获得了各主流浏览器的支持,是CSS3中具有颠覆性的特征之一,可以实现元素的位移.旋转.倾斜.缩放,甚至支持矩阵方式,可以取代大量之前只能靠Flash才 ...
- springBoot 发布war/jar包到tomcat(idea)
参考链接:https://blog.csdn.net/qq1076472549/article/details/81318729 1.启动类目录新增打包类: 2.pom.xml新增依赖:<pa ...
- kbmmw 5.10.00 发布
We are happy to announce v5.10.00 of the most complete development add on for Delphi and C++Builder ...
- MySQL Table--独立表空间
数据库表空间 独立表空间 在MySQL 5.6 中引入独立表空间的概念,启用独立表空间后,每个表将生成独立的文件来进行存储. 创建表时可以指定表存放的文件路径 ##首选需要确保innodb_file_ ...