問題描述
在南韓,有一種小的青蛙。每到晚上,這種青蛙會跳越稻田,從而踩踏稻子。農民在早
上看到被踩踏的稻子,希望找到造成最大損害的那只青蛙經過的路徑。每只青蛙總是沿著一
條直線跳越稻田,而且每次跳躍的距離都相同,如圖 所示。
稻田裡的稻子組成乙個柵
格,每棵稻子位於乙個格點上,如圖 所示。
而青蛙總是從稻田的一側跳進稻田,然後沿
著某條直線穿越稻田,從另一側跳出去,如圖 所示。
青蛙的每一跳都恰好踩在一棵水稻上,將這棵水稻拍倒。可能會有多隻青蛙從稻田穿越,
有些水稻被多隻青蛙踩踏。當然,農民所見到的是不是圖中的情形,看不到
稻田柵格示意圖
輸入資料
從標準輸入裝置上讀入資料。第一行上兩個整數 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...