题目大意:给一个记录高度的二维数组,然后找出从大到小的顺序的最长的一条路径。
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
int map[105][105];
int len[105][105];
int n,m;
int max(int a,int b,int c,int d)
{
int t=a;
t = t>=b? t : b;
t = t>=c ? t : c;
t = t>=d ? t : d;
return t;
}
int dfs(int i,int j,int hei)
{
if(map[i][j]==-1 || hei <= map[i][j])return 0;
if(len[i][j]>=0)return len[i][j]; //len大于0的时候就代表他已经被搜索过了 那么就已经记录了他之前所搜过的最大值了 就不需要再搜索了
len[i][j]=max(dfs(i-1,j,map[i][j]),dfs(i+1,j,map[i][j]),dfs(i,j-1,map[i][j]),dfs(i,j+1,map[i][j])) + 1;//该点是周围+1
return len[i][j];
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(map,-1,sizeof(map));
memset(len,-1,sizeof(len));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&map[i][j]);
int ans=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
int length=dfs(i,j,map[i][j]+1);
if(length>ans)ans=length;
}
printf("%d\n",ans);
}
return 0;
}
思路:用一个数组记录每个点的最大的步骤数,枚举没点进行DFS,输出最长的那个。