题目描述
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
DFS递归+记忆,从低向高走,遍历每一个点开始向四个方向走。如果走到的地方层数是比记录的层数要大则更新记录,直到无法再走为止。那么记录的所有点的最高的一个点的层数就是最长的长度。
#include<iostream>
using namespace std;
int a[1001][1001];
int flag[1001][1001];
int r, c;
void dfs_memory(int x, int y,int sum)
{
sum++; //先步数加一
if (a[x][y] < a[x + 1][y] && x<100) //四步走
{
if (sum > flag[x + 1][y]) //走到该点如果更高则更新数据,继续在该点处递归
{
flag[x + 1][y] = sum;
dfs_memory(x + 1, y,sum);
}
}
if (a[x][y] < a[x - 1][y] && x>1)
{
if (sum > flag[x - 1][y])
{
flag[x - 1][y] = sum;
dfs_memory(x - 1, y, sum);
}
}
if (a[x][y] < a[x][y+1] && y<100)
{
if (sum > flag[x][y + 1])
{
flag[x][y + 1] = sum;
dfs_memory(x, y + 1, sum);
}
}
if (a[x][y] < a[x][y - 1] && y>1)
{
if (sum > flag[x][y - 1])
{
flag[x][y - 1] = sum;
dfs_memory(x, y - 1, sum);
}
}
}
int main()
{
int k=1;
cin >> r >> c;
for (int i = 1; i <= r; i++)
{
for (int j = 1; j <= c; j++)
{
cin >> a[i][j];
}
}
for (int i = 1; i <= r; i++) //从每个点开始一次,把所有可行的滑雪道走一遍,用数组记录更新最长的记录
for (int j = 1; j <= c; j++)
dfs_memory(i, j, 1);
for (int i = 1; i <= r; i++) //从记录的所有点中找最长的一个输出
for (int j = 1; j <= c; j++)
if (flag[i][j] > k)
k = flag[i][j];
cout << k;
return 0;
}