首页 > 代码库 > UVa 10285 Longest Run on a Snowboard

UVa 10285 Longest Run on a Snowboard

这题我的第一感觉就是用DFS。自己写的貌似不够完美,因为我看见别人的时间都特别的短,而我的有点长。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
using namespace std;
const int N=102;
int height[N][N];
bool visited[N][N];
int dx[]={1,0,-1,0};
int dy[]={0,1,0,-1};
int m,n,m_len;
bool judge(int x,int y)
{
    if(visited[x][y])
        return false;
    return (x>=1&&x<=n)&&(y>=1&&y<=m);
}
bool isdec(int x,int y)
{
    for(int i=0;i<4;i++)
    {
        int a=x+dx[i];
        int b=y+dy[i];
        if(judge(a,b)&&height[a][b]<height[x][y])
            return true;
    }
    return false;
}
void dfs(int x,int y,int len)
{
    if(!isdec(x,y))
    {
        if(m_len<len)
            m_len=len;
        return;
    }
    for(int i=0;i<4;i++)
    {
        int a=x+dx[i];
        int b=y+dy[i];
        if(height[a][b]>=height[x][y])
            continue;
        if(judge(a,b))
        {
            visited[a][b]=true;
            dfs(a,b,len+1);
            visited[a][b]=false;
        }
    }
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        char s[40];
        scanf("%s%d%d",s,&n,&m);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
            scanf("%d",&height[i][j]);
        int ans=0;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                memset(visited,false,sizeof(visited));
                m_len=0;
                dfs(i,j,1);
                if(ans<m_len)
                    ans=m_len;
            }
        }
        printf("%s: %d\n",s,ans);
    }
    return 0;
}


UVa 10285 Longest Run on a Snowboard