poj3414 Pots BFS

【代码超详解】POJ 3414 Pots(BFS,0 ms) 一、题目描述 Pots Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 29772 Accepted: 12428 Special Judge Description You are given two pots, having the volume of A and B liters respectively. The ... 阅读详情

Pots
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 13400 Accepted: 5641 Special Judge

Description

You are given two pots, having the volume of A and B liters respectively. The following operations can be performed:

  1. FILL(i)        fill the pot i (1 ≤ i ≤ 2) from the tap;
  2. DROP(i)      empty the pot i to the drain;
  3. POUR(i,j)    pour from pot i to pot j; after this operation either the pot j is full (and there may be some water left in the pot i), or the pot i is empty (and all its contents have been moved to the pot j).

Write a program to find the shortest possible sequence of these operations that will yield exactly C liters of water in one of the pots.

Input

On the first and only line are the numbers A, B, and C. These are all integers in the range from 1 to 100 and C≤max(A,B).

Output

The first line of the output must contain the length of the sequence of operations K. The following K lines must each describe one operation. If there are several sequences of minimal length, output any one of them. If the desired result can’t be achieved, the first and only line of the file must contain the word ‘impossible’.

Sample Input

3 5 4

Sample Output

6
FILL(2)
POUR(2,1)
DROP(1)
POUR(2,1)
FILL(2)
POUR(2,1)


刚开始想用BFS这么写会不会爆内存,毕竟不去重的话广搜的状态树是指数增长的,结果没有, 而且0MS AC,应该是标记去掉了很多重复的


其实BFS的过程就是个层序遍历状态树的过程(已经将不可能走的节点情况去掉了),深搜则类似于二叉树的前序或中,后序遍历(实际可能遍历一个多叉树)






//poj3414 pots BFS
#include <cstdio>
#include <vector>
#include <cstring>
#include <queue>
#include <iostream>

using namespace std;

const int maxn = 100 + 10;

//路径节点
struct pnode {
	char s[2];
	int x, y;
};

//BFS队列中的状态节点
struct node {
	int a, b, cnt;
	vector<pnode> p;
};

int A, B, C, ans;
bool vis[maxn][maxn];
queue<node> Q;

void print(vector<pnode> p) {
	printf("%d\n", p.size());
	for (int i = 0; i < p.size(); i++) {
		switch (p[i].s[0]) {
		case 'f': printf("FILL(%d)\n", p[i].x); break;
		case 'd': printf("DROP(%d)\n", p[i].x); break;
		case 'p': printf("POUR(%d,%d)\n", p[i].x, p[i].y); break;
		}
	}
}

void fill(int x, node tn) {
	pnode pn;
	if (x == 1) {
		tn.a = A;
	}
	else if (x == 2) {
		tn.b = B;
	}
	if (!vis[tn.a][tn.b]) {
		tn.cnt++;
		pn.s[0] = 'f'; pn.s[1] = 0;
		pn.x = x;
		tn.p.push_back(pn); //新增路径节点
		vis[tn.a][tn.b] = true;
		Q.push(tn);
	}
}

void drop(int x, node tn) {
	pnode pn;
	if (x == 1) {
		tn.a = 0;
	}
	else if (x == 2) {
		tn.b = 0;
	}
	if (!vis[tn.a][tn.b]) {
		tn.cnt++;
		pn.s[0] = 'd'; pn.s[1] = 0;
		pn.x = x;
		tn.p.push_back(pn);
		vis[tn.a][tn.b] = true;
		Q.push(tn);
	}
}

void pour(int x, int y, node tn) {
	int ta, tb; pnode pn;

	ta = tn.a; tb = tn.b;
	if (x == 1) { //pour(1, 2)
		if (ta <= B - tb) {
			tb += ta;
			ta = 0;
		}
		else {
			ta -= (B - tb);
			tb = B;
		}
	}
	else { //pour(2, 1)
		if (tb <= A - ta) {
			ta += tb;
			tb = 0;
		}
		else {
			tb -= (A - ta);
			ta = A;
		}
	}
	if (!vis[ta][tb]) {
		pn.s[0] = 'p'; pn.s[1] = 0;
		pn.x = x; pn.y = y;
		tn.a = ta; tn.b = tb;
		tn.cnt++;
		tn.p.push_back(pn);
		vis[ta][tb] = true;
		Q.push(tn);
	}
}

bool bfs() {
	while (!Q.empty()) Q.pop();
	memset(vis, false, sizeof(vis));

	node ns;
	ns.a = 0; ns.b = 0; ns.cnt = 0;

	vis[0][0] = true;
	Q.push(ns);

	while (!Q.empty()) {
		node tn = Q.front(); Q.pop();
		if (tn.a == C || tn.b == C) {
			print(tn.p);
			return true;
		}
		fill(1, tn);
		fill(2, tn);
		drop(1, tn);
		drop(2, tn);
		pour(1, 2, tn);
		pour(2, 1, tn);
	}
	return false;
}

int main()
{
	while (~scanf("%d%d%d", &A, &B, &C)) {
		if (!bfs()) {
			printf("impossible\n");
		}
	}
	return 0;
}




PaddleOCR实战:如何在CentOS 8.5上搭建高性能OCR识别环境 本文详细介绍了在CentOS 8.5系统上搭建高性能PaddleOCR识别环境的完整指南。从系统环境准备、PaddlePaddle框架部署到PaddleOCR的定制化安装与性能优化,提供了针对生产环境的解决方案,包括GPU/CPU环境配置、内核参数调优及常见问题排查,帮助用户实现高效OCR识别。 阅读详情

相关推荐

IMU自动校准论文与代码实现A Robust and Easy to Implement Method for IMU Calibration without External Equipments

PART1 摘要 低成本的惯性测量单元会受到系统误差的影响,系统误差由标度因子和轴偏差造成,这会降低位置和姿态估计的精度。 本文提出了一种无需任何外部设备的,鲁棒性强,易于实现的IMU校准方法。 该程序基于多放置方案,再估计传感器偏差的同时,为加速度和陀螺仪三轴的尺度和偏差系数。我们的方法只需要用手移动传感器,并将其放置在一组不同的静态位置(姿态)。 论文描述了一个鲁棒的快速校准协议,...

qq_29313679的博客 5308

设计与算法:Pots

设计与算法:23Pots

ffsdfg的博客 1079

从MC到DC:三维重建算法的核心原理与实战对比

本文深入对比了三维重建领域两大经典算法Marching Cubes(MC)与Dual Contouring(DC)的核心原理与实战表现。MC算法原理直观、实现简单,但存在特征丢失和二义性问题;DC算法通过求解二次误差函数(QEF)和利用法向量信息,能更好地保留模型的尖锐特征,但计算更复杂。文章结合医学影像处理实例,为开发者根据速度、精度和特征保真度需求选择合适算法提供了清晰指南。

weixin_29251131的博客 1031

【POJ 3414 --- Pots】BFS

【POJ 3414 --- Pots】BFS 题目来源:点击进入【POJ 3414 — Pots】 Description You are given two pots, having the volume of A and B liters respectively. The following operations can be performed: FILL(i) fill t...

来日浅谈的博客 521

抖音短视频数据抓取实战系列(一)——模拟器性能对比与优化配置

本文是抖音短视频数据抓取实战系列的开篇,重点探讨了模拟器选型与优化配置。通过对比雷电、夜神、逍遥三大主流模拟器在性能、抖音兼容性及抓包友好度上的表现,文章指出雷电模拟器因其稳定的桥接网络模式和良好的兼容性,是数据抓取的优选。并提供了雷电模拟器从安装、网络桥接到系统优化的详细配置指南,旨在帮助读者构建稳定高效的抓取环境。

weixin_29230901的博客 244

拆解大疆M300电池BMS:基于TI TIDA-010030方案的硬件架构深度分析

本文深度解析了大疆M300无人机电池管理系统(BMS)基于TI TIDA-010030参考设计的硬件架构。通过对比TI方案与大疆实现的差异,详细介绍了BQ7694003监控前端和BQ34Z100电量计的优化设计,以及通信架构的可靠性改进。文章还揭示了大疆在成本、空间和标准化方面的工程妥协与创新平衡,为锂电池保护方案提供了实践参考。

weixin_27066963的博客 237

POJ 3414 Pots【BFS水】

POJ 3414 Pots大意:有两只桶,容量分别为a,b,对每只桶,有以下三种操作:1.Fill(i)装满第i只桶2.DROP(i)将桶i的水倒掉3.POUR(i,j),将桶i中的水倒入桶j,若桶j满,剩余的水遗留于桶i中 问能否通过这些操作使得某只桶恰好装有容量为c的水?若能,输出最少操作次数及过程PS:c<max(a,b); 算法:BFS即可 #include&...

a48634331的博客 149

一文搞懂鲸鱼优化算法Whale Optimization Algorithm(WOA)!!!(核心原理+数学模型+代码实战+实际应用)

本文详细介绍了鲸鱼优化算法(WOA)的原理与实现。该算法模拟座头鲸气泡网捕食行为,通过包围猎物、螺旋攻击和随机搜索三种策略平衡全局探索与局部开发。文章首先从生物学角度解释鲸鱼捕食行为,然后给出算法的数学模型和完整流程,包括关键公式和决策逻辑。最后通过Python代码实例演示如何求解Sphere函数最小值,展示算法的实际应用。WOA具有结构简单、参数少等优点,在工程优化、机器学习等领域有广泛应用前景。

qq_42212808的博客 1011

倒水(BFS)Pots POJ - 3414

Pots POJ - 3414 题目链接 bfs题; 标注的状态应为2容器的体积,因为每种2容器的体积都应该只由一种状态达到。 不使用队列 #include<stdio.h> #include<string.h> struct node{ int now_x; int now_y; int step; int howcome; int before; }ll[10050];...

qq_43559193的博客 262

SAP-ABAP:SAP中的用户确认对话框:深入理解与实践POPUP_TO_CONFIRM

本文深入介绍了SAP中的用户确认对话框函数POPUP_TO_CONFIRM,包括其核心参数配置、返回值处理、应用场景和最佳实践。该函数是SAP二次开发中重要的交互工具,用于关键操作前获取用户确认,防止误操作。文章详细解析了参数设置技巧,强调必须全面处理所有可能的返回值,并提供了删除数据、批量操作等典型应用场景的代码示例。同时对比了其他类似弹出函数,帮助开发者选择合适工具。正确使用该函数可提升系统安全性、改善用户体验并符合SAP设计规范。

baidu_35680696的博客 970

PLC为西门子的S7-1200,舵机为 DS3218,PLC控制舵机旋转程序实现?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 998

poj 3414 Pots 【BFS+记录路径 】

//yy:昨天看着这题突然有点懵,不知道怎么记录路径,然后交给房教了,,,然后默默去写另一个bfs,想清楚思路后花了半小时写了120+行的代码然后出现奇葩的CE,看完FAQ改了之后又WA了。然后第一次用对拍去找特殊数据折腾到十二点半终于AC,最后只想感叹没有仔细读题,没办法啊看着英语略烦躁,不扯了,那个题题解不想写了,回到这题。。。今天中午还是花了四十分钟写了这题(好慢啊orz),感觉,...

dhe56357的博客 151

CLASSB类移植(满足IEC 60730-1和60355-1标准)

针对软件认证需要满足IEC 60730-1和60335-1标准,ST公司专门提供的软件扩展包X-CUBE-CLASSB,它包含自测库和文档,支持多种STM32系列芯片,通过预集成测试库和标准化流程,帮助开发者快速满足国际安全标准,适用于家电、工业控制等高可靠性场景。ClassB软件包程序检测内容分为两个主要部分:启动时的自检和运行时的周期自检,MCU在上电的时候会进行复位启动,在启动完成以后会进行运行自检。

m0_61973119的博客 1401

POJ - 3414 Pots BFS + 记录并输出路径

POJ - 3414 Pots 题意: 给你两个杯子的容量 和 最后杯子中剩余水的容量。有三种操作方式 FILL(i)        将第 i 个杯子装满水 DROP(i)      将第 i 个杯子的水倒空  POUR(i,j)     将第 i 个杯子中的水倒入第 j 个杯子中     可能有两种情况:(1) i 杯子中的水还没全倒入 j 杯子中 j 杯子就满了,此时 i 杯子中还...

没有梦想何以远行 272

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

POJ 3414 Pots (BFS/DFS)

Pots Time Limit:1000MS Memory Limit:65536K Total Submissions:7783 Accepted:3261 Special Judge Description You are given two pots, having the volume ofA...

airen6935的博客 190

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

POJ 3414 Pots(图论:BFS)

POJ 3414 Pots(图论:BFS) http://poj.org/problem?id=3414 题意:给你两个容量为A和B的空水杯,要你通过3种操作(程序中分为了6种)来实现A或B杯中有一个杯子中的水是C升. 分析:典型BFS问题.        不过该题目需要输出路径.所以我们用一个结构node来表示到达(i,j)状态时,它的前一个状态是node.i和node.j且操作时nod

code 1530

POJ.3414 Pots (BFS)

POJ.3414 Pots (BFS)题意分析给你两个容器,分别能装下A升水和B升水,并且可以进行以下操作 FILL(i) 将第i个容器从水龙头里装满(1 ≤ i ≤ 2); DROP(i) 将第i个容器抽干 POUR(i,j) 将第i个容器里的水倒入第j个容器(这次操作结束后产生两种结果,一是第j个容器倒满并且第i个容器依旧有剩余,二是第i个容器里的水全

Pengwill's Blog 352

POJ 3414 Pots 均分水(bfs)

题目链接: POJ 3414 Pots 题目大意: 有两个水杯,一开始都没有装水,给出两个水杯的容量,和要达到的目标容量 每个水被有三种操作:1.装满水,2.倒掉所有水,3,将水倒入另一个杯子中. 思路: 两个杯子,六种操作,,求最短路,并打印路径,6入口bfs,跟非常可乐一题类似 Description You are given two pots, having the

Dextrad_ihacker的博客 1342

POJ - 3414 Pots(BFS)

POJ - 3414 Pots(BFS) #include<iostream> #include<queue> using namespace std; typedef pair<int,int> PII; string s[105][105], ans; bool dist[105][105]; int main(){ int a,b,c;cin>>a>>b>>c; queue<PII> q; q

00后的博客 168

【POJ 3414】Pots(BFS)

思路: 哎呀,这题有种似曾相识的感觉。经分析得这题也是有六次操作,和HDU 1495-非常可乐很类似嘛。稍微麻烦点的就是要输出一对操作字符串。既然是字符串的话,结构体里加一个str变量,然后每次strcpy就可以了。思路很类似,详细见注释。

Chen_yuazzy的博客 403

POJ3414 Pots —— BFS + 模拟

题目链接:http://poj.org/problem?id=3414 Pots Time Limit:1000MS Memory Limit:65536K Total Submissions:18550 Accepted:7843 Special Judge ...

weixin_30835649的博客 156

poj 3414 pots(bfs暴力+路径记录)

思路:这可真是我目前写过最长的题目了,虽然很多可以复制(学艺不精T-T)。。。 其实思路还是很简单的,就是6种情况,各种倒来倒去,然后记录下路径,我的方法是用一张图来表示,有没有走到过,然后图上每个位置都存着父节点的位置,以及父节点怎么达到,如果找到了逆序输出,如果没找到impossible,具体的看代码吧; 代码如下: #include &lt;iostream&gt; #include...

摆渡人的博客 274

POJ 3414 Pots(bfs)

Pots

Pandora_heart的博客 336

poj3414 Pots--BFS

题目来源: poj 3414 问题描述 有两个空壶,最终要将其中一个壶装水量达到给定值。对壶有3种操作方式,一是开水龙头装满,二是倒光,三是将其中一个壶的水倒到另一个壶里,且水倒光或者另一个壶装满。若能实现目标则输出最小步骤数且按顺序输出操作,若不能实现,则输出“impossible” 未AC…之后再看 #include <iostream> #include <queue&gt...

圣托里尼的日落啊~的博客 336
上一篇: hdu2614 Beat BFS or DFS
下一篇: UVa 11988 Broken Keyboard (a.k.a. Beiju Text) 数组模拟单向链表
Daemoonn
博客等级 码龄11年 42粉丝 198原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值