計算機等級考試C語言程序設(shè)計例解(06)

字號:

06.設(shè)有大小不等的X,Y,Z三個無刻度的油桶,分別能夠盛滿油X,Y,Z(例如,X=80,Y=50,Z=30),并約定X>Y>Z。初始時,僅X油桶盛滿油,Y和Z油桶為空。要求程序?qū)ふ乙环N最少的分油步聚,在某個油桶中分出T升油(例如T=40)。
    解:
     令三個油桶的盛油情況為倒油過程的狀態(tài),則倒油過程就是狀態(tài)變化的過程。為了記錄倒油過程,程序引入倒油狀態(tài)隊列,將倒油過程中產(chǎn)生的狀態(tài)存儲在隊列中。隊列的每個元素記錄每次分油后各個油桶的分油后各個油桶的盛油量和倒油軌跡等有關(guān)信息。程序反復從隊列中取出第一個還未檢查過的狀態(tài),對該狀態(tài)下的每個油桶判斷其是否可以倒出油,及是否可以倒進油。由于油桶沒有刻度,分油時只能將某個油桶倒?jié)M或倒空。程序分別按倒空或倒?jié)M兩種可能的倒油動作執(zhí)行不同的處理,產(chǎn)生新的倒油狀態(tài),為避免某個倒油狀態(tài)在隊列中重復出現(xiàn),程序只將未曾出現(xiàn)過的新狀態(tài)及其倒油軌跡信息存入隊列中,假定程序檢查了相當多的狀態(tài)后,或能找到解,或能確定問題無解。
    倒油程序算法如下:
    算法---無刻度油桶分油
    {
     輸入各桶容量和目標容量;
     將初始狀態(tài)存入倒油狀態(tài)隊列;
     設(shè)置其它初始值;
     do
     {
     對狀態(tài)隊列中第一個還未檢查的元素
     在還未檢查完每個倒出的桶且還未找到解且還未確定無解情況下循環(huán)
     if(倒出桶有油)
     在還未檢查完每個桶且還未找到解且還未確定無解情況下循環(huán)
     if(當前桶不是倒出桶且桶還有空)
     {
     確定本次倒油量;
     在隊列中檢查倒油后的結(jié)果狀態(tài)是否在隊列中出現(xiàn);
     if(結(jié)果狀態(tài)不在隊列中出現(xiàn))
     {
     將結(jié)果狀態(tài)和軌跡信息存入隊列;
     if(有桶中的油達到目標容量)
     設(shè)置找到解標志;
     }
     }
     if(還未找到解)
     {
     修正隊列第一個還未檢查過的元素指針;
     if(隊列中的元素都已檢查過)
     設(shè)置無解標志;
     }
     }while(還未找到解且還未確定無解);
     if(找到解)
     {
    根據(jù)倒油步聚的軌跡信息,形成倒油步聚序列;
     輸出倒油步聚序列;
     }
    }
    倒油隊列中的元素應包含下列信息:各桶的盛油量,該狀態(tài)是從哪一個桶(源桶)倒向哪一個桶(目標桶)而形成的,形成該狀態(tài)的元素在隊列中的位置。根據(jù)以上算法編寫如下程序。