演算法分析——青蛙過河問題

富察·傅恆發表於2020-11-08

本文作者原創,如需轉載,請註明原作者和地址,謝謝合作!

一、問題描述

一條小溪尺寸不大,青蛙可以從左岸跳到右岸,在左岸有一石柱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,研究出一個變數後再把另一個變數加進來找出其中的規律,然後得到遞迴公式。

相關文章