題目描述:
倒水問題 「fill a」 表示倒滿a杯,"empty a"表示倒空a杯,「pour a b」 表示把a的水倒到b杯並且把b杯倒滿或a倒空。
輸入:輸入包含多組資料。每組資料輸入 a, b, c 資料範圍 0 < a <= b 、c <= b <=1000 、a和b互質。
輸出:你的程式的輸出將由一系列的指令組成。這些輸出行將導致任何乙個罐子正好包含c單位的水。每組資料的最後一行輸出應該是「success」。輸出行從第1列開始,不應該有空行或任何尾隨空格。
sample input:
2 7 5
2 7 4
sample output:
fill b
pour b a
success
fill a
pour a b
fill a
pour a b
success
題目思路:
這個題目看起來無厘頭,但是實際上可以看成是乙個迷宮的問題,起點是(0,0),終點座標中橫座標或者縱座標裡包含了c這個數,如(x,c)或(c,y),每次走的點並不是往四周走乙個點,而是像上面說的那樣,如果橫座標是a,縱座標是b:
fill a:意味著橫座標從當前到最大,縱座標不變。
fill b:意味著縱座標從當前到最大,橫座標不變。
empty a:意味著橫座標清零,縱座標不變。
empty b:意味著縱座標清零,橫座標不變。
pour a b:意味著橫座標減少縱座標增加,直到b滿或者a空為止。
pour b a:意味著縱座標減少橫座標增加,直到a滿或者b空為止。
if
(!vis[ca]
[b])if(
!vis[a]
[cb])if
(!vis[0]
[b])if(
!vis[a][0
])int c=a+b>ca?ca:a+b;if(
!vis[c]
[a+b-c]
) c=a+b>cb?cb:a+b;if(
!vis[a+b-c]
[c])
這樣就和迷宮問題一樣,建立乙個佇列,然後不斷的通過以上方式加入點,記錄下每一步操作,直到出現了需要的容量,然後按序輸出就可以了
**如下:
#include
#include
#include
using
namespace std;
int ca,cb,n;
bool vis[
4000][
4000];
struct node
node
(int qa,
int qb,string ss)};
queue qu;
void
bfs(
) cout<<
"success"
<
return;}
//以下見上面分析if(
!vis[ca]
[b])if(
!vis[a]
[cb])if
(!vis[0]
[b])if(
!vis[a][0
])int c=a+b>ca?ca:a+b;
//看看倒入之後是否是滿,滿就取最大,不滿就全倒進去if(
!vis[c]
[a+b-c]
) c=a+b>cb?cb:a+b;
//同上if(
!vis[a+b-c]
[c])
}return;}
intmain()
return0;
}
執行結果:
第一周作業
專案shrinkwrap games operating systems 這些軟體是怎麼說服你 陌生人 成為他們的使用者的?他們的目標都是盈利麼?通過廣告 老使用者口碑推薦 實體店推薦等方式發展新使用者,目標一般是盈利的,賺取使用者現金。通過廣告 老使用者口碑推薦等方式發展新使用者,目標一般是盈利的...
第一周作業
我的乙個小目標 7月13下午15.58分,我不遠千里踏上了北上求學謀生之路 年近快30歲的我深深的感到了孔子所謂的男人三十而立的壓力,從小到大父母對我的要求和期望都比較大,而我總是讓他們失望,一直都是一事無成,有的時候我都在質問自己甚至心中還有一絲幻想,如果時光能倒退從來我以前一定好好學習,考乙個好...
第一周作業
1 常見linux的發行版有哪些?並描述不同發行版之間的聯絡與區別 主要分redhat系列和debian系列。不同發行版本之間的區別是包管理工具的不同 redhat系列 redhat centos,fedora debian系列 linux mint ubuntu,debian gnu linux ...