滑雪问题(dfs+递归)记忆化搜索 c语言

来源:互联网 发布:双系统windows连不上网 编辑:程序博客网 时间:2024/06/06 14:12

BackGroud

今年冬天,到西岭雪山上滑雪的人越来越多。滑雪场的管理人员为了提高游客滑雪的兴趣,决定组织一场滑雪比赛。但他们在比赛地点的选择上出现了困难,因为他们无法记算出某个场地所需要的最长滑雪时间,进而安排获奖的时间段。他们现在请求你的帮助。


The Problem

我们把场地分为一个个的格子,给每个格子标定一个整数,代表这个格子所代表的地面的海拔高度。 比赛的参赛者可以从任意一个格子开始,但只能向相邻的四个格子移动,并且目地格子的高度必须小于现在所在格子的高度。我们假设从一个格子滑行到另一个格子所用的时间为1个单位时间。现在我们给出场地的大小(n*m)和每个格子所代表的地面的海拔高度。你能计算出在这个场地上最长能滑行多少时间吗?

输入

本题包括多组测试数据。每组测试数据的第一行为两个整数n和m(1<=m,n<=50),分别代表场地的行和列数。接下来是一个n*m的矩阵。包含每个格子所代表的地面的海拔高度。当n=m=0时输入结束,这组数据不包括在需要计算的数据中。

输出

对于每一组输入数据,输出一个整数,代表这个场地上最长能滑行多少时间。

样例输入

4 4
1 12 11 10
2 13 16 9
3 14 15 8
4 5 6 7
4 4
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
0 0

样例输出

15
6

解题:

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

 

int n, m; 

int Map[100][100]; 

int dp[100][100]; 

int deta[4][2] = {{1, 0}, {-1, 0}, {0, 1},{0, -1}};//在这里定义这个数组是代表向下向上向左向右四种可能性。

int max(int x,int y)

{

   returnx>=y?x:y;

}

int solve(int x, int y) 

         inti = 0;

   if (dp[x][y] > 0) 

       return dp[x][y]; 

   for (; i < 4; i++) { 

       int nx = x + deta[i][0]; 

       int ny = y + deta[i][1]; 

       if (0 <= nx && nx < n && 0 <= ny && ny< m && Map[nx][ny] < Map[x][y]) { 

           dp[x][y] = max(dp[x][y], solve(nx, ny) + 1); 

       } 

    } 

   return dp[x][y]; 

int main() 

{

          int ans = 0; 

          int i = 0;

          int j = 0;

           int e = 0;

           int f = 0;

          scanf("%d%d", &n, &m);

  while(n!=0&&m!=0)

   {

            ans=0;

        memset(dp, 0, sizeof(dp)); //为了把dp数组中的每个数初始化为0.

       for(i=0;i< n; i++)

                   { 

                            for(j=0; j<m; j++)

                            {

                                     scanf("%d",&Map[i][j]); 

                            }

       } 

                  

       for (e=0; e < n; e++) { 

           for (f=0; f < m; f++) {

                           

                ans = max(ans, solve(e,f)); //map中每一个数都考虑到了。

                            }

       } 

                    printf("%d\n", ans);

       scanf("%d%d", &n, &m);

   }

  

         system("PAUSE");

   return 0; 

}

原创粉丝点击