算法竞赛入门经典:第七章 暴力求解法 7.18倒水问题

该博客介绍了一个使用广度优先搜索算法解决倒水问题的方法,目标是通过6升、3升和1升的杯子在无刻度的情况下量出4升水。博客提供了详细的算法思路和代码实现,包括状态搜索、状态转移和倒水操作的合法性检查。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
倒水问题:
有装满水的6升杯子、空的3升杯子和一升杯子,3个杯子中都没有刻度。在不使用其他道具的情况下,是否可以量出4升的水呢?
输入:
6(满杯水所在的刻度) 3 1
输出:
(6,0,0)->(3,3,0)->(3,2,1)->(4,2,0)

思路:
这与倒可乐是一个问题,关键在与状态的搜索。
1 采用广度优先搜索算法
2 当前状态的下一状态的方法为:(a,b,c)
状态:全部分
*/

/*
关键:
1 小杯子倒向大杯子,只能全部倒入。大杯子倒向小杯子,把大杯子加满。
2 需要使用倾倒函数。量出4升水的方法是:3升杯装中装2升,1升杯0升,6升杯中为4升。
3 如何打印状态,需要在状态中设置访问标记。设置一个父节点指针,到时候逆向打印即可
4 迷宫是无向图,倒水是有向状态图

*/

#include <stdio.h>
#include <stdlib.h>
#include <queue>

#define MAXSIZE 1024

using namespace std;

typedef struct Stat
{
	Stat(int a,int b,int c,int d,Stat* s):x(a),y(b),z(c),t(d),par(s){}
	int x;//6升杯中容量
	int y;//3升杯中容量
	int z;//1升杯中容量
	int t;//倾倒次数
	Stat* par;
	//int v;//访问标记,1表示访问
}Stat;

queue<Stat> queueStat;
queue<Stat> printStat;
Stat endStat(0,0,0,0,NULL);
//int iCapA,iCapB,iCapC;//3个容器的容量

void dump(int iConA,int& iVa,int iConB,int& iVb)//A容器中的水倒向B容器中的水
{
	if(iVa > iConA || iVb > iConB || iVa &l
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值