量水问题输出任一解

192 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

2、量水问题描述

对量水问题给出产生式系统描述,并画出状态空间图。有两个无刻度标志的水壶,分别可装5升和2升的水。设另有一水缸,可用来向水壶灌水或倒出水,两个水壶之间,水也可以相互倾灌。已知5升壶为满壶,2升壶为空壶,问如何通过倒水或灌水操作,使能在2升的壶中量出一升的水来。

基本要求:

要求:写出算法的设计思想和源程序,并以图形用户界面实现人机交互,进行输入和输出结果,如:Please input L1: 5         Please input L2: 2

Successed or Failed?: Successed

Optimal Procedure: 50->32->30->12->10->01

用两个没有刻度的容器量出一定量的水 (1)首先判断有没有容器符合题干的取水量,如果有,则结束,如果没有则进行操作 (2)如果两个容器都是空的,则向第一个容器里面加满水,然后将第一个容器里面的水加入到第二个容器里面,在加水前,判断两个容器的存水量,进而对加水后的容器的存水量进行修改,如果第一个容器此时还没有满足题干要求,则判断第二个容器是不是满了,如果第二个容器已满,则将第二个容器里面的水全部倒出,转操作(1)

image.png

#include<iostream>
using namespace std;
int main()
{
	int X, Y;   //容器的容量
	cout << "请分别输入A,B的容量:";
	cin >> X >> Y;
	int S;    //需要量出的水;
	cout << "请输入需要量出的水的量:";
	cin >> S;
	int a = 0, b = 0;    //容器现有的状态
		while (b != S&&a!=S)
		{
			if (a == 0) 
			{
				a = X;
				cout << a<<b<<"->";
			}
			else
			{
				if (a + b >= Y)
				{
					a = a + b - Y;
					b = Y;
					
					cout << a << b << "->";
				}
				else
				{
					b = a + b;
					a = 0;
					cout << a << b << "->";
				}
				if (a != S)
				{
					if (b == Y)
					{
						b = 0;
						cout << a << b << "->";
					}
				}
			}
		}
		return 0;
}

image.png

image.png