skiing
时间限制:3000 ms | 内存限制:65535 KB
难度:5
- 描述
- 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更长。事实上,这是最长的一条。
- 输入
- 第一行表示有几组测试数据,输入的第二行表示区域的行数R和列数C(1 <= R,C <= 100)。下面是R行,每行有C个整数,代表高度h,0<=h<=10000。
后面是下一组数据;
- 输出
- 输出最长区域的长度。
- 样例输入
-
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
- 样例输出
-
25
分析:
因为数据量比较小可以依次判断每一个点的最长距离,再在这些最长距离中找出最最长的距离即为题解
核心代码(模板):1 void dfs(int x, int y, int step) 2 { 3 //以形如 if(...) return ; 4 //或者 if(...) ans = max(ans, step); 判断dfs的出口 5 6 // 循环,这里及就是每一个方向 7 for(int i = 0; i <= 3; ++ i) 8 { 9 if(book[x + mov[i][0]][y + mov[i][1]]) continue; // 判断是否是已经被使用的点 10 book[x + mov[i][0]][y + mov[i][1]] = 1; // 未被使用我们就标记它被使用以便下次调用dfs 11 dfs(x + mov[i][0], y + mov[i][1], step + 1); 12 book[x + mov[i][0]][y + mov[i][1]] = 0; // 还原 13 } 14 }
C/C++代码实现(AC):
1 #include <iostream> 2 #include <algorithm> 3 #include <cmath> 4 #include <cstring> 5 #include <cstdio> 6 #include <queue> 7 #include <set> 8 #include <map> 9 #include <stack> 10 11 using namespace std; 12 const int MAXN = 110; 13 int my_map[MAXN][MAXN], book[MAXN][MAXN], ans, R, C, t, temp, mov[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}}; 14 15 void dfs(int x, int y, int step) 16 { 17 if (x <=0 || y <= 0 || x > R || y > C) return ; 18 if (step > ans) ans = step; 19 for(int i = 0; i <= 3; ++ i) 20 { 21 if(book[x + mov[i][0]][y + mov[i][1]] || my_map[x][y] <= my_map[x + mov[i][0]][y + mov[i][1]]) continue; 22 book[x + mov[i][0]][y + mov[i][1]] = 1; 23 dfs(x + mov[i][0], y + mov[i][1], step + 1); 24 book[x + mov[i][0]][y + mov[i][1]] = 0; 25 } 26 } 27 28 int main () { 29 scanf("%d", &t); 30 while (t --) 31 { 32 ans = 0; 33 memset(book, 0, sizeof(book)); 34 memset(my_map, 0, sizeof(my_map)); 35 scanf("%d%d", &R, &C); 36 for(int i = 1; i <= R; ++ i) 37 { 38 for(int j = 1; j <= C; ++ j) 39 { 40 scanf("%d",&my_map[i][j]); 41 } 42 } 43 44 for(int i= 1; i <= R; ++ i) 45 { 46 for(int j = 1; j <= C; ++j) 47 { 48 dfs(i, j, 1); 49 } 50 } 51 printf("%d ", ans); 52 } 53 return 0; 54 }