滑雪
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 50251 | Accepted: 18250 |
Description
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
输出最长区域的长度。
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
就是从各点进行搜索,并用以数组记录搜索的结果,一遍下次搜索该处时再用
然后遍历一下该数组,找到最大的一个元素
参考代码:
1 #include2 #include 3 using namespace std; 4 int map[105][105]; 5 int f[][2]={ { 1,0},{ 0,1},{ -1,0},{ 0,-1}}; 6 int vis[105][105] ; 7 int m , n ; 8 int DFS ( int x , int y ) 9 { 10 if ( vis[x][y] != -1 ) 11 return vis[x][y] ; 12 int i ; 13 int sum = 1 ; 14 for ( i = 0 ; i < 4 ; i ++ ) 15 { 16 int s = x + f[i][0] ; 17 int t = y + f[i][1] ; 18 if ( s < 0 || t < 0 || s >= m || t >= n ) 19 continue; 20 if ( map[s][t] >= map[x][y] ) 21 continue; 22 sum = max ( sum , DFS ( s , t ) + 1 ) ; 23 } 24 vis[x][y] = sum ; 25 return sum ; 26 } 27 int main() 28 { 29 while ( cin >> m >> n ) 30 { 31 int sum = 0; 32 int i , j ; 33 for ( i = 0 ; i < m ; i ++ ) 34 for ( j = 0 ; j < n ; j ++ ) 35 cin >> map [i][j] ; 36 memset ( vis , -1 , sizeof ( vis ) ) ; 37 for ( i = 0 ; i < m ; i ++ ) 38 for ( j = 0 ; j < n ; j ++ ) 39 sum = max ( sum , DFS ( i , j ) ) ; 40 cout << sum << endl ; 41 } 42 return 0 ; 43 }