蓝桥杯练习(最长滑雪道)
首先,这是题目:
由于是连通块问题,可以使用DFS遍历解决,DFS的解释看这儿:
(非递归DFS)https://www.cnblogs.com/abella/p/10097889.html
(递归DFS)DFS(深度优先遍历) & BFS:(广度优先遍历)_dfs深度优先遍历_Korpse的博客-CSDN博客
综合DFS深度优先遍历理解_dfs遍历时间定理_sandalphon4869的博客-CSDN博客
所以这里直接给出代码注释,使用的递归的DFS:
#include<iostream>
#include<string.h>
#define MAXSIZE 100
using namespace std;
int co = 0, R, C;
const int dx[4] = { 1,0,-1,0 };//定义方向上下
const int dy[4] = { 0,1,0,-1 };//定义方向左右
void dfs(int a[][MAXSIZE], int i, int j, int sum);
int main()
{
int i, j, a[MAXSIZE][MAXSIZE];
cin>>R>>C;
for (i = 0; i < R; i++)
{
for (j = 0; j < C; j++)
{
cin >> a[i][j];
}
}
for (i = 0; i < R; i++)
{
for (j = 0; j < C; j++)
{
dfs(a, i, j, 1);
}
}
cout << co << endl;
system("pause");
return 0;
}
void dfs(int a[][MAXSIZE], int i, int j, int sum)
{
int t, x, y;
if (sum > co)//找出可以走的路径中的最大值
co = sum;
for (t = 0; t < 4; t++)//向上下左右分别搜索
{
x = i + dx[t];//在节点处向上和下移动
y = j + dy[t];//在节点处向左和右移动
if (x >= 0 && x < R&&y >= 0 && y < C&&a[x][y] < a[i][j])//如果没有超出数组边界且这个节点比原来的小
{
sum++;//我们的路的长度加一
dfs(a, x, y, sum);//在新节点重复此次循环,到达路径最小处结束循环
sum--;//回溯到可以走的节点时把走过的路的长度减去
}
}
}
var code = "f874abd4-967b-4c3b-b13f-abd722171106"
END

浙公网安备 33010602011771号