poj 1054 討厭的青蛙

2021-05-22 16:41:24 字數 1418 閱讀 8792

這個問題看起來很複雜,其實目的很簡單:幫助農民找到為害最大的青蛙。也就是要找到

一條穿越稻田的青蛙路徑,這個路徑上被踩踏的水稻不少於其他任何青蛙路徑上被踩踏的水

稻數。當然,整個稻田中也可能根本就不存在青蛙路徑。問題的關鍵是:找到穿越稻田的全

部青蛙路徑。任何一條穿越稻田的青蛙路徑l,至少包括3 棵被踩踏的水稻。假設其中前兩

棵被踩踏的水稻分別是(x1,y1)、(x2,y2),那麼:

 令dx=x2-x1、dy=y2-y1;x0=x1-dx、y0=y1- dy;x3=x2 + dx、y3=y2 + dy

 (x0,y0)位於稻田之外,青蛙從該位置經一跳後進入稻田、踩踏位置(x1,y1)上的水稻

 (x3,y3)位於稻田之內,該位置是l 上第3 棵被青蛙踩踏的水稻

 xi=x0 + idx、yi=y1 + idy(i3),如果(xi,yi)位於稻田之內,則(xi,yi)上的水稻必被

青蛙踩踏

根據上述規則,只要知道一條青蛙路徑上的前兩棵被踩踏的水稻,就可以找到該路徑上其

他的水稻。為了找到全部的青蛙路徑,只要從被踩踏的水稻中,任取兩棵水稻(x1,y1)、(x2,

y2),判斷(x1,y1)、(x2,y2)是否能夠作為一條青蛙路徑上最先被踩踏的兩顆水稻。

解決方案

這個問題的描述中,最基本的元素是被踩踏的水稻。在程式中要選擇乙個合適的資料結構,

來表達這個基本元素。這個資料結構是否合適的標準是:在程式中要表達這個元素時,能否

用乙個單詞或者短語,即用乙個變數來表示。

struct plant

這個問題的主要計算是:從被踩踏的水稻中選擇兩棵(x1,y1)、(x2,y2)。判斷它們是否

能夠作為一條青蛙路徑上最先被踩踏的兩顆水稻。(x1,y1)、(x2,y2)唯一確定了蛙跳的方

向和步長,從(x2,y2)開始,沿著這個方向和步長在稻田內走。每走一步,判斷所到達位置

上(x,y)的水稻是否被踩踏,直到走出稻田為止。如果在某一步上,(x,y)沒有被踩踏,

則表明(x1,y1)、(x2,y2)是一條青蛙路徑上最先被踩踏的兩顆水稻的假設不成立。這個判

斷的演算法在問題求解過程中要反覆使用,它的效率成為決定整個計算效率的關鍵。

 用乙個plant 型的陣列plants[5001]表示全部被踩踏的水稻

 將plants 中的元素按照行/列序號的公升序(或者降序)排列

 採用二分法查詢plants 中是否有值為(x,y)的元素:將(x,y)與plants 中間的元素比較,

(1)相等,表明找到了元素;(2)比plants 中間元素的小,繼續在plants 的前半部尋找;(3)

比plants 中間元素的大,繼續在plants 的後半部尋找。

採用上述方法判斷每走一步所到達位置上(x,y)的水稻是否被踩踏,最多只要比較log2n,

其中n 是稻田中被踩踏水稻的總量。

列舉 案例(討厭的青蛙poj1054)

問題描述 在南韓,有一種小的青蛙。每到晚上,這種青蛙會跳越稻田,從而踩踏稻子。農民在早 上看到被踩踏的稻子,希望找到造成最大損害的那只青蛙經過的路徑。每只青蛙總是沿著一 條直線跳越稻田,而且每次跳躍的距離都相同,如圖 所示。稻田裡的稻子組成乙個柵 格,每棵稻子位於乙個格點上,如圖 所示。而青蛙總是從...

討厭的青蛙

題目很長,直接放鏈結討厭的青蛙 要求出最長的路徑,就要比較所有的路徑長度。對於每一條路徑,因為步長相等,所以只要確定開始兩個被踩的點就可以求出整條路徑了。假設前兩個點為 x1,y1 x2,y2 則步長dx x2 x1,dy y2 y1,需要判斷下面三個條件是否都滿足。之後的每個點 xi,yi x i...

討厭的青蛙

問題描述 在南韓,有一種小的青蛙。每到晚上,這種青蛙會跳越稻田,從而踩踏稻子。農民在早 上看到被踩踏的稻子,希望找到造成最大損害的那只青蛙經過的路徑。每只青蛙總是沿著一 條直線跳越稻田,而且每次跳躍的距離都相同,如圖8 4 所示。稻田裡的稻子組成乙個柵 格,每棵稻子位於乙個格點上,如圖8 5 所示。...