原题链接:矩形滑雪场
解题思路:
最开始使用的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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复