討厭的青蛙

2021-08-29 10:02:18 字數 1709 閱讀 3874

題目很長,直接放鏈結討厭的青蛙

要求出最長的路徑,就要比較所有的路徑長度。對於每一條路徑,因為步長相等,所以只要確定開始兩個被踩的點就可以求出整條路徑了。假設前兩個點為(x1,y1),(x2,y2),則步長dx=x2-x1,dy=y2-y1,需要判斷下面三個條件是否都滿足。

之後的每個點(xi,yi)=(x(i-1)+dx,y(i-1)+dy)=(x2+(i-2)*dx,y2+(i-2)*dy)

(x1-dx,y1-dy)需要落在稻田之外

將路徑上的最後一棵水稻記作(xk,yk),則(xk+dx,yk+dy)需要落在稻田之外

因此,程式只需要列舉前兩個點,然後判斷整條路徑是否存在並判斷長度是否大於當前最大值,即可。判斷乙個點是否被踩過,可以用乙個布林矩陣。布林矩陣一開始就存好各個點的狀態,true表示被踩過,false表示沒有被踩過。這樣之後判斷可以用o(1)的效率確定乙個點是否被踩過。

由於時限要求,實現時要注意一些條件的判斷,以提高效率。例如,當下列條件之一滿足時,當前列舉的兩個點的路徑就不滿足最長路徑。

青蛙不能經過一跳從稻田外跳到(x1,y1)上(此時一定不滿足條件)。

按照(x1,y1),(x2,y2)確定的步長,從(x1,y1)出發,青蛙經過(maxsteps-1)步,就會跳到稻田外,其中maxsteps就是當前已經找到的最好答案(此時即使滿足條件,答案也不會更優)。

#include #include #include using namespace std;

#define maxn 5000+10

struct point;

int ans=0;//答案,即最大被踩水稻數

bool flag[maxn][maxn];

point p[maxn];

int r,c;

bool outside(int x1,int y1)

bool operator <(const point &a,const point &b)

int main()

//排序可以提高效率

//每種可行的路徑都既可以從小到大跳過去,也可以從大到小跳

sort(p,p+n);

for(int i=0;i實現技巧:

可以將稻田儲存為矩陣,從而快速判斷乙個點是否被踩過。考慮到空間要求,矩陣可以使用bool型別,從而避免超出記憶體空間限制。

注意以下條件可以提高時間效率。

練習時出現的一些問題:

1.剛開始不懂排序的作用,嘗試直接去掉排序

for(int i=0;i這樣列舉,答案一直錯誤,後來發現這樣不能列舉完所有情況

而下面這樣列舉又會超時

for(int i=0;i對於任何一條可行的路徑,青蛙可以從大座標往小座標跳,也可以從小座標往大座標跳而把p陣列排序後,所以排序後再列舉就可以大大減少列舉次數。

2.題目要考慮的因素太多,總是忘記一些

while(!outside(x1,y1)&&flag[x1][y1])

路線的最後乙個點必須能一步跳到稻田外,所以累加到最後的那個點不僅要滿足不在被踩點的範圍裡,還要滿足!outside(x1,y1)

一開始忘記判斷累加點是否被踩過,寫成了這個樣子

while(!outside(x1,y1))
以至於下乙個if函式始終不理解判斷點是否在稻田外的做法

if(outside(x1,y1)&&k>ans)

ans=k;

討厭的青蛙

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

演算法題 討厭的青蛙

青蛙問題,求解一條路徑 這條路徑中被乙隻青蛙壓倒的稻子最多 青蛙只會在乙個方向上前進,並且步長是一定的 include include include using namespace std int r,c,n struct plant 記錄被踩壞的水稻座標 為了debug方便自己先初始化 plan...

poj 1054 討厭的青蛙

這個問題看起來很複雜,其實目的很簡單 幫助農民找到為害最大的青蛙。也就是要找到 一條穿越稻田的青蛙路徑,這個路徑上被踩踏的水稻不少於其他任何青蛙路徑上被踩踏的水 稻數。當然,整個稻田中也可能根本就不存在青蛙路徑。問題的關鍵是 找到穿越稻田的全 部青蛙路徑。任何一條穿越稻田的青蛙路徑l,至少包括3 棵...