POJ 1088 滑雪

进入公司时的面试题目,当时挂了。。。

题目: (摘自http://poj.org/problem?id=1088)

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。当然25-24-23-...-3-2-1更长。事实上,这是最长的一条。

Input

输入的第一行表示区域的行数R和列数C(1 <= R,C <= 100)。下面是R行,每行有C个整数,代表高度h,0<=h<=10000。

Output

输出最长区域的长度。
 1 #include <stdio.h>
 2 
 3 
 4 int map[101][101] = {0};
 5 int res[101][101] = {0};
 6 int row;
 7 int col;
 8 int result = 0;
 9 int xpos[4] = {-1, 1, 0, 0};
10 int ypos[4] = {0, 0, -1, 1};
11 
12 int dfs(int x, int y)
13 {
14     int newx, newy, tempres;
15     int t_max = 0;
16     if (res[x][y] > 0)
17     {
18         return res[x][y];
19     }
20     for (int i = 0; i < 4; i++)
21     {
22         newx = x + xpos[i];
23         newy = y + ypos[i];
24         if (newx <= row && newx >= 1 && newy <= col && newy >= 1 && map[newx][newy] < map[x][y])
25         {
26             tempres = dfs(newx, newy);
27             if (t_max < tempres)
28                 t_max = tempres;
29         }
30     }
31     res[x][y] = t_max + 1;
32     return t_max + 1;
33 }
34 
35 int main(int argc, char * argv[])
36 {
37     int i,j,k;
38     scanf("%d", &row);
39     scanf("%d", &col);
40     for ( i = 1; i <= row; i++)
41     {
42         for ( j = 1; j <= col; j++)
43         {
44             scanf("%d", &(map[i][j]));
45         }
46     }
47     for ( i = 1; i <= row; i++)
48     {
49         for ( j = 1; j <= col; j++)
50         {
51             res[i][j] = -1;
52         }
53     }
54     for ( i = 1; i <= row; i++)
55     {
56         for ( j = 1; j <= col; j++)
57         {
58             k =  dfs(i, j);
59             if (result < k)
60                 result = k;
61         }
62     }
63 
64     printf("%d", result);
65 
66     return 0;
67 }
原文地址:https://www.cnblogs.com/ruichenduo/p/5947599.html