洛谷1434 滑雪

题目描述
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;
}

猜你喜欢

转载自blog.csdn.net/slience_646898/article/details/82290286