题目描述
小明喜欢滑雪,为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。小明想知道在一个区域中最长底滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子:
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 . 当然 25-24-23-…-3-2-1 更长。事实上,这是最长的一条.
输入描述
输入的第一行表示区域的行数 R和列数 C(1<R, C <100). 下面是 R行,每行有 C个整数,代表高度 h , 0 <h <10000。
输出描述
输出最长区域的长度.
样例输入
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
样例输出
25
AC代码
#include<iostream>
using namespace std;
//二维数组存图
int arr[110][110];
int r, c;
int ans = 0;
//深搜
//根据题意,只能从高处向低处滑,并且可以选择四个方向
//要寻找到最长的那条路径,那么我们可以对所有点都深搜依次,然后比较出最长的那一条
//主义不要越界
//深搜传的条件为当前点的横纵坐标以及当前的路径长度
void dfs(int i,int j,int path)
{//向上滑if (arr[i][j] > arr[i - 1][j] && i-1>=1){//如果可以滑到(i-1,j),我们就对(i-1,j)继续深搜dfs(i - 1, j, path + 1);}//向右滑if (arr[i][j] > arr[i][j + 1] && j+1<=c){dfs(i, j + 1, path + 1);}//向下滑if (arr[i][j] > arr[i + 1][j] && i+1<=r){dfs(i + 1, j, path + 1);}//向左滑if (arr[i][j] > arr[i][j - 1] && j-1>=1){dfs(i, j - 1, path + 1);}//比较得出最长路径ans = max(ans, path);return;
}
int main()
{cin >> r >> c;int i, j;for (i = 1; i <= r; i++){for (j = 1; j <= c; j++){cin >> arr[i][j];}}int maxnum = -99999;//对每个点都进行一次深搜,然后得出最长路径for (i = 1; i <= r; i++){for (j = 1; j <= c; j++){dfs(i, j, 1);}}cout << ans << endl;return 0;
}
如果有好的方法,欢迎提出!