#include <stdio.h> #include <string.h> #include <math.h> int climb(int a[20][20],int x,int y){ int left=0,right=0,up=0,down=0; // 判断当前节点能否继续走下去 if(a[x][y]>a[x-1][y]&&a[x][y]>a[x+1][y]&&a[x][y]>a[x][y+1]&&a[x][y]>a[x][y-1]) return 0; else{ if(a[x][y]<a[x-1][y]) left=climb(a,x-1,y)+1; // 先一直左边走,并且每次更新一次,即往前走一步 if(a[x][y]<a[x+1][y]) right=climb(a,x+1,y)+1; // 左边无法走,就往右边走,然后再次判断左能否走,即进行上下左右判断 if(a[x][y]<a[x][y+1]) up=climb(a,x,y+1)+1; if(a[x][y]<a[x][y-1]) down=climb(a,x,y-1)+1; } int max1=left>right?left:right; int max2=up>down?up:down; // 取四个数中最大的值 return max1>max2?max1:max2; } int main(){ int n,m,len,max; while(scanf("%d %d",&n,&m)!=EOF){ int a[20][20]={0}; max=0; for(int i=1;i<=n;i++){ // 额外创造最外围的0层 for(int j=1;j<=m;j++){ scanf("%d",&a[i][j]); } } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ // 穷举所有可能 len=climb(a,i,j); if(len>max) max=len; } // if (max == n*m-1) break; //减少一点循环 } printf("%d\n",max); } return 0; } |
Double click to view unformatted code.