演算法分析——青蛙過河問題
本文作者原創,如需轉載,請註明原作者和地址,謝謝合作!
一、問題描述
一條小溪尺寸不大,青蛙可以從左岸跳到右岸,在左岸有一石柱L,面積只容得下一隻青蛙落腳,同樣右岸也有一石柱R,面積也只容得下一隻青蛙落腳。有一隊青蛙從尺寸上一個比一個小。我們將青蛙從小到大,用1,2,…,n編號。規定初始時這隊青蛙只能趴在左岸的石頭L上,按編號一個落一個,小的落在大的上面。不允許大的在小的上面。在小溪中有S個石柱,有y片荷葉,規定溪中的柱子上允許一隻青蛙落腳,如有多隻同樣要求按編號一個落一個,大的在下,小的在上,而且必須編號相鄰。對於荷葉只允許一隻青蛙落腳,不允許多隻在其上。對於右岸的石柱R,與左岸的石柱L一樣允許多個青蛙落腳,但須一個落一個,小的在上,大的在下,且編號相鄰。當青蛙從左岸的L上跳走後就不允許再跳回來;同樣,從左岸L上跳至右岸R,或從溪中荷葉或溪中石柱跳至右岸R上的青蛙也不允許再離開。問在已知溪中有S根石柱和y片荷葉的情況下,最多能跳過多少隻青蛙?
二、實驗目的
計算在規定條件(即荷葉落一隻,石柱落多隻,青蛙從大到小從下往上落腳)下,青蛙能通過小溪的最大數量。
三、實驗內容
程式實現(詳細程式碼)
#include<stdio.h>
int Jump(int s,int y)
{
int a;
if(s==0)
{
a=y+1;
}
else
{
a=2*Jump(s-1,y);
}
return a;
}
void main()
{
int s,y,a;
printf("請輸入石柱數 s=" );
scanf("%d",&s);
printf("請輸入荷葉數 y=" );
scanf("%d",&y);
a=Jump(s,y);
printf("Jump(%d,%d)=%d\n",s,y,a);
}
執行結果截圖
程式流程圖
四、總結
本題通過歸納法,先將石柱數量設為0,然後利用荷葉數量找出只有荷葉時的規律,然後加上一個石柱、兩個石柱……以此類推,最終得到遞迴規律:Jump(s,y) = 2*Jump(s-1,y)。這道題啟示我們,當有兩個變數都在變時,不妨先將其中的一個變數設為0,研究出一個變數後再把另一個變數加進來找出其中的規律,然後得到遞迴公式。
相關文章
- LeLeetCode 403. 青蛙過河LeetCode
- LeetCode 403 Frog Jump 青蛙過河 Javascirpt 解決方案LeetCodeJava
- AI基礎:美女和野人過河問題AI
- [每日一題] 第十七題:青蛙跳臺階問題每日一題
- [原始碼和文件分享]基於JAVA實現的農夫過河問題原始碼Java
- 怎樣解題|題3.4.18:跳青蛙
- 劍指 Offer 10- II. 青蛙跳臺階問題JavaJava
- Docker與銀河麒麟的相容性問題Docker
- 避坑指南:關於SPDK問題分析過程
- 小馬過河-RPC之旅RPC
- 透過迴圈引用問題來分析Spring原始碼Spring原始碼
- 第六章 數學問題 -------- 6.9 天平稱重問題【線性同餘方程】青蛙的約會
- ClientAbortException 問題分析clientException
- 遞推-*馬攔過河卒
- 一次「找回」TraceId的問題分析與過程思考
- 前端開發分析-聊聊過程跨域問題處理前端跨域
- 通過幾個問題深入分析Vue中的keyVue
- Spring框架問題分析Spring框架
- JVM 問題分析思路JVM
- HDFS Decommission問題分析
- Rabbimtmq unack問題分析MQ
- 銀河麒麟系統安裝ORACLE資料庫問題處理Oracle資料庫
- 洛谷 P1516 青蛙的約會 題解
- DAY2 做題變態青蛙跳臺階
- A+B 演算法問題演算法
- 演算法——路徑問題演算法
- SonarQube系列-透過配置掃描分析範圍,聚焦關鍵問題
- Docker殺掉了容器?問題分析與解決過程全面覆盤Docker
- 通過解讀WPF觸控原始碼,分析WPF插拔裝置觸控失效的問題(問題篇)原始碼
- MySQL 死鎖問題分析MySql
- 填報 - 分片問題分析
- Linux磁碟滿問題分析Linux
- OOM分析之問題一)OOM
- sonar常見問題分析
- unexpected reloc type問題分析
- 問題賬戶需求分析
- 國產化之銀河麒麟.netcore3.1訪問https服務的兩個問題NetCoreHTTP
- 青蛙跳臺階