进入公司时的面试题目,当时挂了。。。
题目: (摘自http://poj.org/problem?id=1088)
Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道载一个 区域中最长底滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子
一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小。在上面的例子中,一条可滑行的滑坡为24-17-16-1。当然25-24-23-...-3-2-1更长。事实上,这是最长的一条。
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 }