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

2021-08-10 06:09:12 字數 2215 閱讀 6405

問題描述

在南韓,有一種小的青蛙。每到晚上,這種青蛙會跳越稻田,從而踩踏稻子。農民在早

上看到被踩踏的稻子,希望找到造成最大損害的那只青蛙經過的路徑。每只青蛙總是沿著一

條直線跳越稻田,而且每次跳躍的距離都相同,如圖 所示。

稻田裡的稻子組成乙個柵

格,每棵稻子位於乙個格點上,如圖  所示。

而青蛙總是從稻田的一側跳進稻田,然後沿

著某條直線穿越稻田,從另一側跳出去,如圖  所示。

青蛙的每一跳都恰好踩在一棵水稻上,將這棵水稻拍倒。可能會有多隻青蛙從稻田穿越,

有些水稻被多隻青蛙踩踏。當然,農民所見到的是不是圖中的情形,看不到

稻田柵格示意圖

輸入資料

從標準輸入裝置上讀入資料。第一行上兩個整數 r、c,分別表示稻田中水稻的行數和

列數,1≤r、c≤5000。第二行是乙個整數 n,表示被踩踏的水稻數量, 

3≤n≤5000。在剩下

的 n 行中,每行有兩個整數,分別是一顆被踩踏水稻的行號(1~r)和列號(1~c),兩個整數用

乙個空格隔開。而且,每棵被踩踏水稻只被列出一次。

輸出要求

從標準輸出裝置上輸出乙個整數。如果在稻田中存在青蛙行走路徑,則輸出包含最多水

稻的青蛙行走路徑中的水稻數量,否則輸出 0。

輸入樣例

6 714 

2 1 

6 6 

4 2 

2 5 

2 6 

2 7 

3 4 

6 1 

6 2 

2 3 

6 3 

6 4 

6 5 

6 7輸出樣例

7問題分析:

1.首先是任意選擇兩個點,計算之間的距離;再確定第乙個點是不是在田地外,如果不是的話,直接討論另外兩個點;

(這裡可以先對每乙個點進行排序,先是按照

x排序,如果

x相同,再按照

y排序;)這樣做的目的是減少列舉的次數;

比如:當計算出來某乙個比較大的步數後,可以使用這個特性將其判斷後面的點有乙個點不在田地裡,

就可以直接將這個點之後的所有點不用討論,(也可以在後面進行查詢的時候進行二分查詢;) 2.

特別注意:一定注意當確定一條路可以走,必須走到頭,才能計算它的步數,否則,步數恢復原來的最小步數;

#include #include #include #define num 5005

using namespace std;

struct dot

;int mycompare( const void *ele1, const void *ele2 )

dot dot[num];

bool vis[num][num];

int main()

qsort(dot, dotno, sizeof(dot), mycompare);//排序;

int dx,dy,x0,y0,x1,y1;

for( int i = 0;i0 && y0>0 && y0<=c)

x1 = dot[i].x+(max_num-1)*dx;

if(x1>r) //如果滿足條件,說明步長太大,換下乙個點步長只會更大,說明第乙個點錯了。

break;

//max_num為當前最大步數,先判斷這個點是否能比已經儲存的最大值的步長還長,如果不是,直接換另乙個點再做判斷;

y1=dot[i].y+(max_num-1)*dy;

if(y1<1||y1>c)

continue;

x1 = dot[j].x+dx;

y1=dot[j].y+dy;

int steps = 2;

while (x1 <= r && x1 > 0 && y1 <=c && y1 > 0)

else

}if(steps>max_num)}}

if(max_num>2)

cout <

討厭的青蛙

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

討厭的青蛙

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

列舉 討厭的青蛙(演算法基礎 第2周)

問題講解 分析 講解的很好了,再說就是畫蛇添足。原始碼 include include include using namespace std int r,c,n struct plant plant plants 5001 plant plant int searchpath plant secp...