韩信走马分油(C语言)
任務描述
泊松是法國數學家、物理學家和力學家。他一生致力科學事業,成果頗多。有許多著名的公式定理以他的名字命名,比如概率論中著名的泊松分布。 有一次閑暇時,他提出過一個有趣的問題,后稱為:“泊松分酒”。在我國古代也提出過類似問題,遺憾的是沒有進行徹底探索,其中流傳較多是:“韓信走馬分油”問題。有3個容器,容量分別為12升,8升,5升。其中12升中裝滿油,另外兩個空著。要求你只用3個容器操作,最后使得某個容器中正好有6升油。下面的列表是可能的操作狀態記錄:
12,0,0
4,8,0
4,3,5
9,3,0
9,0,3
1,8,3
1,6,5
每行3個數據,分別表示12,8,6升容器中的油量,第一行表示初始狀態,第二行表示把12升倒入8升容器后的狀態,第三行是8升倒入5升,... 當然,同一個題目可能有多種不同的正確操作步驟。
編程要求
根據提示,在右側編輯器編寫代碼。
本題目的要求是,由用戶輸入:各個容器的容量,開始的狀態,和要求的目標油量,程序則通過計算輸出是否可能分成功-“Y”,“N”。
例如,用戶輸入:
12,8,5,12,0,0,6
用戶輸入的前三個數是容器容量(由大到小),接下來三個數是三個容器開始時的油量配置,最后一個數是要求得到的油量(放在哪個容器里得到都可以), 則程序可以輸出“Y”
測試說明
平臺會對你編寫的代碼進行測試:
測試輸入:12 8 5 12 0 0 6
預期輸出:Y
解析:
首先定義一套規則
題目中的瓶子總共有三種,最大的A,中等的B,最小的C,我們規定:
最大的瓶子只能往中等的瓶子倒;(若中等的瓶子為空)
中等的瓶子只能往最小的瓶子倒;(若最小的瓶子不滿)
最小的瓶子只能往最大的瓶子倒;(若最小的瓶子已滿)
流動時單項的也是唯一的,如果出現了開始的狀態則說明容易不可能成功。
#include <stdio.h> int main(){int A, B, C, a, b, c, t;scanf("%d", &A);scanf("%d", &B);scanf("%d", &C);scanf("%d", &a);scanf("%d", &b);scanf("%d", &c);scanf("%d", &t);int aa = a, bb = b, cc = c;while(aa != t && bb != t && cc != t){ // 每一步都加了判斷, 因為如果測試集不夠嚴謹,例如3 1 1 3 0 0 1 可能會得出N,因為可以會內部循環,但其實第一步就已經成功了。if(bb == 0){if(aa >= B){aa -= B;bb = B;}else{aa = 0;bb = aa;}}if(aa == t || bb == t || cc == t){printf("Y\n");break;}if(cc < C){int m = C - cc;if(bb >= m){cc = C;bb -= m;}else{cc += bb;bb = 0;}}if(aa == t || bb == t || cc == t){printf("Y\n");break;}if(cc == C){int m = A - aa;if(m >= cc){aa += cc;cc = 0;}else{aa += cc;cc -= m;}}if(aa == t || bb == t || cc == t){ // 找到了值printf("Y\n");break;}if(aa == a && bb == b && cc == c){ // 又回到了原狀態 printf("N\n");break; }} return 0; }總結
以上是生活随笔為你收集整理的韩信走马分油(C语言)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iphonexs和xr什么区别(苹果ip
- 下一篇: 小乔台词是什么(王者荣耀小乔)