zoj 1005 Jugs

最近一直在看算法的知識,也順便刷刷題,不過還是一直被虐。這道題相信每個人都認識的了,就是兩個用兩個水壺弄出指定量的水。一開始完全不知道要怎麼下手,後來嘗試了一下,用了很複雜的邏輯,結果第一個案例就死循環然後完全不知道怎麼調試。後來搜了一下網上的博客,看到一個人說他後來發現題目其實很簡單,因爲並沒有要求是最優解,自己並沒有看代碼,想想還是要自己動腦寫出來的好。然後第一次就accept了。

思維很簡單,就是當小的水壺水滿的時候就把它倒掉,如果是空的並且大水壺不空則大水壺的水倒過去,如果大水壺空則將其裝滿。求出來的不是最優解。代碼如下:

#include <iostream>

using namespace std;

void jug2jug(int Ca, int Cb, int N)
{
	char bigjug = 'A', smalljug = 'B';
	int big = Ca, small = Cb, A, B;
	//	bigjug 保存大水壺的標號,smalljug保存小水壺的標號
	//	big 保存大水壺的容量,small保存小水壺的容量
	if (Ca < Cb){
		bigjug = 'B';
		smalljug = 'A';
		big = Cb;
		small = Ca;
	}
	A = big;
	//	裝滿大水壺
	B = 0;
	cout << "fill " << bigjug << endl;
	while (A != N){
		//	當大水壺所裝水量不是所指定的水量時循環
		if (B == small){
			//	小水壺滿了則將其倒掉
			B = 0;
			cout << "empty " << smalljug << endl;
		}
		else{
			if (A == 0){
				//	大水壺空了則將其裝滿
				A = big;
				cout << "fill " << bigjug << endl;
			}
			else if (A <= big){
				//	小水壺不滿且大水壺不空,則將大水壺的水倒入小水壺中
				if (A + B > small){
					A = A + B- small;
					B = small;
				}
				else{
					B = A + B;
					A = 0;
				}
				cout << "pour " << bigjug << ' ' << smalljug << endl;
			}
		}
	}
	cout << "success" << endl;

}

int main()
{
	int Ca, Cb, N;
	while (cin >> Ca >> Cb >> N)
		jug2jug(Ca, Cb, N);
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值