原题链接:矩形滑雪场
解题思路:
最开始使用的dfs加visited数组,对于100*99的数组直接超时了。
参考https://blog.dotcpp.com/a/70053修改后,正确提交,通过一个二维数组记录每个点为起点的最大滑雪长度。
超时代码:
#include <stdio.h> #include <stdlib.h> int directions[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}}; void dfs(int **data, int row, int col, int **visited, int path, int *maxsize, int from_x, int from_y) { int to_x, to_y; int cnt = 0; for (int i = 0; i < 4; i++) { to_x = from_x + directions[i][0]; to_y = from_y + directions[i][1]; if ((to_x >= 0 && to_x < row && to_y >= 0 && to_y < col) && (data[to_x][to_y] < data[from_x][from_y]) && (!visited[to_x][to_y])) { cnt++; visited[to_x][to_y] = 1; dfs(data, row, col, visited, path + 1, maxsize, to_x, to_y); visited[to_x][to_y] = 0; } } if (cnt == 0 && path > *maxsize) { // 无路可走 *maxsize = path; } } int main() { int row, col; scanf("%d %d", &row, &col); int **data = (int **) malloc(sizeof(int *) * row); int **visited = (int **) malloc(sizeof(int *) * row); for (int i = 0; i < row; i++) { data[i] = (int *) malloc(sizeof(int) * col); visited[i] = (int *) malloc(sizeof(int) * col); for (int j = 0; j < col; j++) { scanf("%d", &data[i][j]); visited[i][j] = 0; } } int maxsize = 0; for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { visited[i][j] = 1; dfs(data, row, col, visited, 1, &maxsize, i, j); visited[i][j] = 0; } } printf("%d", maxsize); return 0; }
参考代码:
#include #include #define MAX(a, b)((a)>(b)?(a):(b)) int directions[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}}; int dfs(int **data, int row, int col, int **dp, int from_x, int from_y) { int to_x, to_y; int path = 0; for (int i = 0; i < 4; i++) { // 4个方向 to_x = from_x + directions[i][0]; to_y = from_y + directions[i][1]; if ((to_x >= 0 && to_x < row && to_y >= 0 && to_y < col) && // 目标点索引在范围内 (data[to_x][to_y] < data[from_x][from_y])) { // 下坡 if (dp[to_x][to_y] == 0) { dfs(data, row, col, dp, to_x, to_y); // 目标点未计算 } path = MAX(path, dp[to_x][to_y]); // 求出四个方向的最大距离 } } return dp[from_x][from_y] = path + 1; } int main() { int row, col; scanf("%d %d", &row, &col); int **data = (int **) malloc(sizeof(int *) * row); int **dp = (int **) malloc(sizeof(int *) * row); for (int i = 0; i < row; i++) { data[i] = (int *) malloc(sizeof(int) * col); dp[i] = (int *) malloc(sizeof(int) * col); for (int j = 0; j < col; j++) { scanf("%d", &data[i][j]); dp[i][j] = 0; } } int maxsize = 0; for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { maxsize = MAX(maxsize, dfs(data, row, col, dp, i, j)); } } for (int i = 0; i < row; i++) { free(data[i]); free(dp[i]); } free(data); free(dp); printf("%d", maxsize); return 0; }
0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复