无脑博士的试管们java_计蒜客 无脑博士和他的试管们
標簽:
無腦博士有三個容量分別是A,B,C升的試管,A,B,C分別是三個從1到20的整數(shù),最初,A和B試管都是空的,而C試管是裝滿硫酸銅溶液的。有時,無腦博士把硫酸銅溶液從一個試管倒到另一個試管中,直到被灌試管裝滿或原試管空了。當然每一次灌注都是完全的。由于無腦博士天天這么折騰,早已熟練,溶液在倒的過程中不會有丟失。
寫一個程序去幫助無腦博士找出當A是個是空的時候,C試管中硫酸銅溶液所剩量的所有可能性。
輸入包括一行,為空格分隔開的三個數(shù),分別為整數(shù)A,B和C。
輸出包括一行,升序地列出當A試管是空的時候,C試管溶液所剩量的所有可能性。
樣例1
輸入:
2 5 10
輸出:
5 6 7 8 9 10#include
#include
#define MAX 21
int state[MAX][MAX],A,B,C;//狀態(tài)數(shù)組state[i][j]代表A試管中有 i 升 溶液 B試管中有 j 升溶液的狀態(tài)是否存在
void dfs(int a,int b,int c){
?????state[a][b]=1;
?????if(a
??????????if(c>=A-a&&state[A][b]==0)dfs(A,b,c-A+a);//可倒?jié)M
??????????if(c
??????????if(b>=A-a&&state[A][b-A+a]==0)dfs(A,b-A+a,c);
??????????if(b
??????}
??????if(b
??????????if(c>=B-b&&state[a][B]==0)dfs(a,B,c-B+b);
??????????if(c
??????????if(a>=B-b&&state[a-B+b][B]==0)dfs(a-B+b,B,c);
??????????if(a
??????}
??????if(c
??????????if(a>=C-c&&state[a-C+c][b]==0)dfs(a-C+c,b,C);
??????????if(a
??????????if(b>=C-c&&state[a][b-C+c]==0)dfs(a,b-C+c,C);
??????????if(b
??????}
}
int main(){
???int i;
???scanf("%d%d%d",&A,&B,&C);
???memset(state,0,sizeof(state));
???dfs(0,0,C);
???int frist=1;//用于保證輸出格式,首次輸出不在數(shù)字前加空格
???for(i=B;i>=0;i--){
??????if(state[0][i]){//若存在A試管為0,B試管為 i的狀態(tài),則輸出
?????????if(frist)frist=0;
?????????else printf("");
??????????????printf("%d",C-i);
?????????????}
??????}
????return 0;
}
?
又是一道dp題目(和倒水問題很像)這次就是用到所謂記憶化搜索的方式進行動態(tài)規(guī)劃,同時對解答圖進行了dfs,練習dfs就是我做這題的本意。
因為總的溶液量為C 故 可用(i,j)來表示狀態(tài),i 為試管 A 當前容量 ,j 為 試管B 當前容量, 顯然,C 試管容量為 C – i - j,從(i,j)狀態(tài)可能發(fā)生的變化,即倒水的方式只有
c -> a ,b - > a, c - > b, a -> b, a -> c , b - >c 這6種方式。
而從 一個試管倒水到另一個試管有兩種可能性,倒水試管和變?yōu)?0 和接水 試管被倒?jié)M (我們可把倒水試管變?yōu)?且接水試管接滿歸到兩種情況之一),
于是我們可通過兩試管當前容量與最大容量的關系來判斷某種倒水方式能否進行
同時,對于可能出現(xiàn)的重復狀態(tài),我們用數(shù)組state來進行記憶,標志某種狀態(tài)是否出現(xiàn)過,來減少重復計算,同時可用state數(shù)組來得出最終解。又發(fā)現(xiàn)狀態(tài)即為解的情況。。
最后又是吐槽時間,計蒜客的題目的分類讓我總是能快速找到解題的方向,這道題想出思路花了我沒多久時間,因為是遞歸的實現(xiàn)起來也不能,就是在if判斷哪里碼了好久,尼瑪
一點錯誤都不能有,我只能小心翼翼地寫,幸虧一次正確,但是這題我還是WA了,因為輸出格式錯誤,我做過這么多題(并沒有)還是第一次看到這種錯誤提示,從白書里看到
的技巧第一次有了用武之地,然后就AC了,這題還是蠻水的,但也挺典型的。還有下載的word代碼高亮插件不給力啊。。為什么沒有C/C++的啊!幸虧其他語言也有
int If //注釋什么的,有了這些基本代碼還能看,還有我真的無法對vim喜歡起來,特別是計蒜客那個在線閹割版的,我就是個只能靠IDE的普通人沒辦法。。
標簽:
總結
以上是生活随笔為你收集整理的无脑博士的试管们java_计蒜客 无脑博士和他的试管们的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java青蛙青蛙跳井_速解青蛙跳井问题
- 下一篇: java 注解 数据字典_Spring实