记录编号 122977 评测结果 AAAAAAAAAA
题目名称 登山 最终得分 100
用户昵称 Gravatardevil 是否通过 通过
代码语言 C++ 运行时间 0.053 s
提交时间 2014-09-25 09:21:28 内存使用 0.34 MiB
显示代码纯文本
#include <cstdlib>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;

int mountain[65][65];
int vis[65][65];
int ans=0,n,m;
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};

void dfs(int x,int y,int cnt,int up_down)
{
    if(cnt>ans) ans=cnt;
    vis[x][y]=1;
    if(up_down==0)
    {
        for(int i=0;i<4;i++)
        {
            int nx=x+dx[i];
            int ny=y+dy[i];
            if(!vis[nx][ny]&&nx>=0&&nx<n&&ny>=0&&ny<m)
            {
                if(mountain[nx][ny]>mountain[x][y])
                {
                    dfs(nx,ny,cnt+1,0);
                }
                else if(mountain[nx][ny]<mountain[x][y])
                {
                    dfs(nx,ny,cnt+1,1);
                }
            }
        }
    }
    else
    {
        for(int i=0;i<4;i++)
        {
            int nx=x+dx[i];
            int ny=y+dy[i];
            if(!vis[nx][ny]&&nx>=0&&nx<n&&ny>=0&&ny<m)
            {
                if(mountain[nx][ny]<mountain[x][y])
                {
                    dfs(nx,ny,cnt+1,1);
                }
            }
        }
    }
    vis[x][y]=0;
}

int main()
{
    freopen("hike.in","r",stdin);
    freopen("hike.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++)
      for(int j=0;j<m;j++)
      {
          scanf("%d",&mountain[i][j]);
      }
    for(int i=0;i<n;i++)
      for(int j=0;j<m;j++)
      {
          memset(vis,0,sizeof(vis));
          dfs(i,j,1,0);
          memset(vis,0,sizeof(vis));
          dfs(i,j,1,1);
      }
    printf("%d\n",ans);
    return 0;
}