滑雪 记忆化搜索

来源:互联网 发布:手机游戏设计软件 编辑:程序博客网 时间:2024/05/04 21:39
Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道载一个区域中最长底滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子
 1  2  3  4 516 17 18 19 615 24 25 20 714 23 22 21 813 12 11 10 9

一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小。在上面的例子中,一条可滑行的滑坡为24-17-16-1。当然25-24-23-...-3-2-1更长。事实上,这是最长的一条。
Input
输入的第一行表示区域的行数R和列数C(1 <= R,C <= 100)。下面是R行,每行有C个整数,代表高度h,0<=h<=10000。
Output
输出最长区域的长度。
Sample Input
5 51 2 3 4 516 17 18 19 615 24 25 20 714 23 22 21 813 12 11 10 9
Sample Output
25
#include<stdio.h>#include<string.h>#include<math.h>#include<stdlib.h>#include<algorithm>#include<iostream>#include<queue>using namespace std;int maps[105][105];int vis[105][105];int m, n;int d[4][2] = { 1,0,0,1,-1,0,0,-1 };int dfs(int x, int y){if (vis[x][y]) { return vis[x][y]; }int Max = 0;for (int i = 0; i<4; i++){int tx = x + d[i][0];int ty = y + d[i][1];if (tx >= m || tx<0 || ty>=n || ty<0 || maps[tx][ty]>=maps[x][y]){continue;}Max = max(Max, dfs(tx, ty));}vis[x][y] = Max + 1;return vis[x][y];}int main(){while (~scanf("%d %d", &m, &n)){for (int i = 0; i<m; i++){for (int j = 0; j<n; j++){scanf("%d", &maps[i][j]);}}int Max = 0;memset(vis, 0, sizeof(vis));for (int i = 0; i<m; i++){for (int j = 0; j<n; j++){Max = max(Max, dfs(i, j));}}printf("%d\n", Max);}return 0;}

// by tp
0 0
原创粉丝点击