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