记忆化搜索,poj1088
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; }