hrbust 下山(深搜)
深度优先搜索及计划搜索:
下山 | |||||
|
|||||
Description | |||||
下面的矩阵可以想象成鸟瞰一座山,矩阵内的数据可以想象成山的高度。 可以从任意一点开始下山。每一步的都可以朝“上下左右”4个方向行走,前提是下一步所在的点比当前所在点的数值小。 例如处在18这个点上,可以向上、向左移动,而不能向右、向下移动。 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9 问题是,对于这种的矩阵,请计算出最长的下山路径。 对于上面所给出的矩阵,最长路径为25-24-23-22-21-20-19-18-17-16-15-14-13-12-11-10-9-8-7-6-5-4-3-2-1,应输出结果25。 |
|||||
Input | |||||
输入包括多组测试用例。 对于每个用例,第一行包含两个正整数R和C分别代表矩阵的行数和列数。(1 <= R,C <= 100) 从第二行开始是一个R行C列矩阵,每点的数值在[0,10000]内。 |
|||||
Output | |||||
输出最长的下山路径的长度。 | |||||
Sample Input | |||||
5 5 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9 |
|||||
Sample Output | |||||
25 1 #include<stdio.h> 2 #include<string.h> 3 int road[110][110];//路 4 int maxstep[110][110];//记录每个位置下山要走的步数 5 int f[8]={-1,0,0,1,0,-1,1,0}; 6 int r,c; 7 int dfs(int i,int j);//深搜 8 int main() 9 { 10 int i,j,max; 11 while(scanf("%d%d",&r,&c)!=EOF) 12 { 13 max=0; 14 for(i=1;i<=r;i++) 15 for(j=1;j<=c;j++) 16 scanf("%d",&road[i][j]); 17 memset(maxstep,0,sizeof(maxstep)); 18 for(i=1;i<=r;i++) 19 for(j=1;j<=c;j++) 20 if(dfs(i,j)>max) 21 max=dfs(i,j); 22 printf("%d\n",max); 23 } 24 return 0; 25 } 26 int dfs(int i,int j) 27 { 28 int a[4],x,y,k; 29 int max=0; 30 if(maxstep[i][j])//计划搜索 31 return maxstep[i][j]; 32 if(i<1||i>r||j<1||j>c) 33 return 0; 34 else //深搜的精华 35 { 36 for(k=0;k<4;k++) 37 { 38 x=i+f[k]; 39 y=j+f[k+4]; 40 if(road[x][y]>=road[i][j]) 41 a[k]=0; 42 else a[k]=dfs(x,y); 43 } 44 for(k=0;k<4;k++) 45 if(a[k]>max) 46 max=a[k]; 47 maxstep[i][j]=max+1; 48 return max+1; 49 } 50 }
|