java編程實現(xiàn)求解八枚銀幣代碼分享
1、引言
筆者在大學的算法競賽中,遇到過這樣的一個題目,現(xiàn)在拿出來與大家分享一下:現(xiàn)在有現(xiàn)有八枚銀幣abcdefgh,已知其中一枚是假幣,其重量不同于真幣,但不知是較輕或較重,如何使用天平以最少的比較次數(shù),決定出哪枚是假幣,并得知假幣比真幣較輕或較重。
2、分析
如果本題目只是很單純的求解假幣是哪一個,問題倒并不是很復雜,只需要回溯遞歸便可求得結果。問題的難點在意,我們需要用最少的步驟?。?!
比之以前的數(shù)據(jù)結構問題,有遞歸,回溯,我們今天可能要接觸一個新的概念,叫做樹。顧名思義,數(shù)結構就是說我們的分析圖示像樹一樣,有分支節(jié)點等各種信息。樹結構是數(shù)據(jù)結構中的一個較大的章節(jié),不在我們的討論之中,在本題目當中,我們會介紹樹的一個小小的分子,決策樹。
我們先建立一下,八個銀幣求解的數(shù)學模型。一個簡單的狀況是這樣的,我們將銀幣依次命名為abcdefg等,我們比較a+b+c與d+e+f,如果相等,則假幣必是g或h,我們先比較g或h哪個較重,如果g較重,再與a比較(a是真幣),如果g等于a,則g為真幣,則h為假幣,由于h比g輕而g是真幣,則h假幣的重量比真幣輕。
如果不相等呢?又是何種情況,我們將依次分支回溯比較,直到得到最終的答案!
3、示例圖
根據(jù)上面的分析,我們可以有一個完整的決策樹圖示:
4、代碼
public class Coins { private int[] coins; public Coins() { coins = new int[8]; for(int i = 0; i < 8; i++) coins[i] = 10; } public void setFake(int weight) { coins[(int) (Math.random() * 7)] = weight; } public void fake() { if(coins[0]+coins[1]+coins[2] == coins[3]+coins[4]+coins[5]) { if(coins[6] > coins[7]) compare(6, 7, 0); else compare(7, 6, 0); } else if(coins[0]+coins[1]+coins[2] > coins[3]+coins[4]+coins[5]) { if(coins[0]+coins[3] == coins[1]+coins[4]) compare(2, 5, 0); else if(coins[0]+coins[3] > coins[1]+coins[4]) compare(0, 4, 1); if(coins[0]+coins[3] < coins[1]+coins[4]) compare(1, 3, 0); } else if(coins[0]+coins[1]+coins[2] < coins[3]+coins[4]+coins[5]) { if(coins[0]+coins[3] == coins[1]+coins[4]) compare(5, 2, 0); else if(coins[0]+coins[3] > coins[1]+coins[4]) compare(3, 1, 0); if(coins[0]+coins[3] < coins[1]+coins[4]) compare(4, 0, 1); } } protected void compare(int i, int j, int k) { if(coins[i] > coins[k]) System.out.print("\n假幣 " + (i+1) + " 較重"); else System.out.print("\n假幣 " + (j+1) + " 較輕"); } public static void main(String[] args) { if(args.length == 0) { System.out.println("輸入假幣重量(比10大或?。?); System.out.println("ex. java Coins 5"); return; } Coins eightCoins = new Coins(); eightCoins.setFake(Integer.parseInt(args[0])); eightCoins.fake(); } }
結果:
輸入假幣重量(比10大或小)
ex. java Coins 5
這里是一段通用的解題方法,大家可以仔細琢磨代碼,對于本段代碼,上面的分析已經(jīng)足夠,剩下的就要大家自己琢磨學習了,這樣才能深刻理解。
總結
以上就是本文關于java編程實現(xiàn)求解八枚銀幣代碼分享的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
相關文章
一文帶你掌握SpringBoot中常見定時任務的實現(xiàn)
這篇文章主要為大家詳細介紹了Spring?Boot中定時任務的基本用法、高級特性以及最佳實踐,幫助開發(fā)人員更好地理解和應用定時任務,提高系統(tǒng)的穩(wěn)定性和可靠性,需要的可以參考下2024-03-03Spring MVC訪問靜態(tài)文件_動力節(jié)點Java學院整理
這篇文章主要為大家詳細介紹了Spring MVC訪問靜態(tài)文件的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-08-08Java 實戰(zhàn)項目之倉庫管理系統(tǒng)的實現(xiàn)流程
讀萬卷書不如行萬里路,只學書上的理論是遠遠不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+jsp+mysql+maven實現(xiàn)一個倉庫管理系統(tǒng),大家可以在過程中查缺補漏,提升水平2021-11-11