蓝桥杯练习(最长滑雪道)

首先,这是题目:

 

由于是连通块问题,可以使用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

posted @ 2020-01-16 22:17  TIM3347_Tian  阅读(20)  评论(0)    收藏  举报  来源