搜尋題 P1434 [SHOI2002]滑雪 洛谷 簡單
阿新 • • 發佈:2018-12-17
題目描述
Michael喜歡滑雪。這並不奇怪,因為滑雪的確很刺激。可是為了獲得速度,滑的區域必須向下傾斜,而且當你滑到坡底,你不得不再次走上坡或者等待升降機來載你。Michael想知道在一個區域中最長的滑坡。區域由一個二維陣列給出。陣列的每個數字代表點的高度。下面是一個例子:
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
一個人可以從某個點滑向上下左右相鄰四個點之一,當且僅當高度減小。在上面的例子中,一條可行的滑坡為24-17-16-1(從24開始,在1結束)。當然25-24-23-…-3-2-1更長。事實上,這是最長的一條。
輸入輸出格式
輸入格式:
輸入的第一行為表示區域的二維陣列的行數R和列數C(1≤R,C≤100)。下面是R行,每行有C個數,代表高度(兩個數字之間用1個空格間隔)。
輸出格式:
輸出區域中最長滑坡的長度。
輸入輸出樣例
輸入樣例#1:
5 5
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
輸出樣例#1:
25
解題思路:思路就是用遞迴,一直求到最小的路徑,然後依次求出其他的路徑,若有兩個答案就判斷一下哪一個路徑更長,最後輸出最長路徑。
#include<cstdio>
#include <iostream>
#include<cstring>
using namespace std;
int x[107][107];
int y[107][107]={0};
int a,b;
int max(int i,int j)
{
if(i>=j)
{
return i;
}
else
{
return j;
}
}
int xun(int e,int d)
{
if(y[e][d]!=0)
{
return y[e][d];
}
else
{
if(e!=0&&x[e-1][d]<x[e][d])
{
y[e][d]=max(y[ e][d],1+xun(e-1,d));
}
if(e!=a-1&&x[e+1][d]<x[e][d])
{
y[e][d]=max(y[e][d],1+xun(e+1,d));
}
if(d!=0&&x[e][d-1]<x[e][d])
{
y[e][d]=max(y[e][d],1+xun(e,d-1));
}
if(d!=b-1&&x[e][d+1]<x[e][d])
{
y[e][d]=max(y[e][d],1+xun(e,d+1));
}
if(y[e][d]==0)
{
return y[e][d]=1;
}
return y[e][d];
}
}
int bianli()
{
int ma=0;
for(int e=0;e<a;e++)
{
for(int d=0;d<b;d++)
{
int k=xun(e,d);
if(k>ma)
{
ma=k;
}
}
}
return ma;
}
int main()
{
cin>>a>>b;
for(int e=0;e<a;e++)
{
for(int d=0;d<b;d++)
{
cin>>x[e][d];
}
}
int ma=bianli();
cout<<ma<<endl;
return 0;
}
製作人:王天碩