hrbust 下山(深搜)

深度优先搜索及计划搜索:

                                                                 下山
Time Limit: 1000 MS Memory Limit: 65536 K
Total Submit: 74(33 users) Total Accepted: 45(33 users) Special Judge: No
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 }

 

posted @ 2012-10-11 21:21  尔滨之夏  阅读(194)  评论(0编辑  收藏  举报