演算法分析——青蛙過河問題
本文作者原創,如需轉載,請註明原作者和地址,謝謝合作!
一、問題描述
一條小溪尺寸不大,青蛙可以從左岸跳到右岸,在左岸有一石柱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
- ACM 過河問題ACM
- LeetCode 403 Frog Jump 青蛙過河 Javascirpt 解決方案LeetCodeJava
- AI基礎:美女和野人過河問題AI
- POJ1700 Crossing River 過河問題ROS
- 過河 手電筒 面試題面試題
- [每日一題] 第十七題:青蛙跳臺階問題每日一題
- [原始碼和文件分享]基於JAVA實現的農夫過河問題原始碼Java
- 透過addm分析io問題
- 通過addm分析io問題
- 劍指 Offer 10- II. 青蛙跳臺階問題JavaJava
- Docker與銀河麒麟的相容性問題Docker
- 小馬過河-RPC之旅RPC
- 劍指offer面試題9 斐波那契數列及青蛙跳臺階問題面試題
- 避坑指南:關於SPDK問題分析過程
- 分析發生在過去的資料庫效能問題資料庫
- 專案管理過程中的問題分析方法(轉)專案管理
- ClientAbortException 問題分析clientException
- 銀河麒麟系統安裝ORACLE資料庫問題處理Oracle資料庫
- 通過幾個問題深入分析Vue中的keyVue
- 透過迴圈引用問題來分析Spring原始碼Spring原始碼
- 前端開發分析-聊聊過程跨域問題處理前端跨域
- 11.2.0.4 grid 安裝時 ssh 過不去問題分析
- 專案管理過程中的問題分析方法1(轉)專案管理
- 專案管理過程中的問題分析方法2(轉)專案管理
- 專案管理過程中的問題分析方法3(轉)專案管理
- 【演算法題】任務分配問題---匈牙利演算法演算法
- Rabbimtmq unack問題分析MQ
- JVM 問題分析思路JVM
- 抽獎問題分析
- 眾數問題分析
- 一次「找回」TraceId的問題分析與過程思考
- 旅行青蛙破解分析從記憶體到存檔再到改包記憶體
- 使用Arcgis pro做流域分析(河網+集水區)
- 演算法問題基於蟻群演算法求解求解TSP問題(JAVA)演算法Java
- 洛谷 P1516 青蛙的約會 題解
- A+B 演算法問題演算法
- 演算法——路徑問題演算法