flag【i】【j】表示以现在这个位置为起点的最远能走的长度,熟悉下递归,这个题应该不难,记忆化
#include<stdio.h>
#include<string.h>
#define Max 105
#define Maxhigh 10005
typedef struct
{
int x,y;
}position;
position move[4]={-1,0,0,1,1,0,0,-1};
int flag[Max][Max];
int maze[Max][Max];
void wall(int r,int c);
int dfs(int i,int j);
int main()
{
int r,c,i,j,max;
while(scanf("%d %d",&r,&c)!=EOF)
{
max=0;
memset(flag,0,sizeof(flag));
for(i=1;i<=r;i++)
for(j=1;j<=c;j++)
scanf("%d",&maze[i][j]);
wall(r,c);
for(i=1;i<=r;i++)
for(j=1;j<=c;j++)
flag[i][j]=dfs(i,j);
for(i=1;i<=r;i++)
for(j=1;j<=c;j++)
if(flag[i][j]>max)
max=flag[i][j];
printf("%d\n",max);
}
return 0;
}
void wall(int r,int c)
{
int i;
for(i=0;i<=r+1;i++)
{
maze[i][0]=Maxhigh;
maze[i][c+1]=Maxhigh;
}
for(i=0;i<=c+1;i++)
{
maze[0][i]=Maxhigh;
maze[r+1][i]=Maxhigh;
}
}
int dfs(int a,int b)
{
if(flag[a][b]) return flag[a][b];
position next;
int i,max=0,k;
for(i=0;i<4;i++)
{
next.x=a+move[i].x;
next.y=b+move[i].y;
if(maze[next.x][next.y]<maze[a][b])
{
k=dfs(next.x,next.y);
if(k>max)
max=k;
}
}
flag[a][b]=max+1;
return max+1;
}