首先我们肯定会想每一个点可以走多远步数。(DFS搜索最远步数)。
然后每个点有很多种走法,所以我们应该把这个点走的最远的步数存在该位置
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
int r,c;
int map1[1000][1000]; //地图
int mark[1000][1000]; //存储该点滑雪到的最远距离
int a[10]= {1,-1,0,0}; //搜索的四个方向
int b[10]= {0,0,1,-1};
bool check(int x,int y) //判断是否不在该地图外
{
if(x>=0&&x<r&&y>=0&&y<c)
return 1;
return 0;
}
int dfs(int x,int y) //搜索问题
{
if(mark[x][y]) //如果该点已经存储能走多远的距离就结束该个dfs
return mark[x][y];
for(int i=0; i<4; i++)
{
int temp1=x+a[i];
int temp2=y+b[i];
if(map1[temp1][temp2]<map1[x][y]&&check(temp1,temp2))
{
int temp=dfs(temp1,temp2)+1;
if(temp>mark[x][y]) //这个是最重要的一点,是让该位置存储最远能走多远的距离
{
mark[x][y]=temp;
}
}
}
return mark[x][y];
}
int main()
{
while(~scanf("%d %d",&r,&c))
{
memset(mark,0,sizeof(mark));
for(int i=0; i<r; i++)
{
for(int j=0; j<c; j++)
{
scanf("%d",&map1[i][j]);
}
}
int res=0;
for(int i=0; i<r; i++)
{
for(int j=0; j<c; j++)
{
mark[i][j]=dfs(i,j);
if(res<mark[i][j])
{
res=mark[i][j];
}
}
}
printf("%d\n",res+1);
}
return 0;
}