过了第2个点却只有40分的蒟蒻求助......

P1434 [SHOI2002] 滑雪

无形的狗子 @ 2019-07-16 11:43:22

#include<iostream>
#include<cstdio>
using namespace std;
long long a[110][110],x,y,s=1,xx,yy;
int h[5]={-1,0,0,1},l[5]={0,-1,1,0},maxn=0;
int hsm()
{
    int m,n;
    long long big=0;
    for(int k=0;k<4;k++)
    {
        m=x+h[k];
        n=y+l[k];
        if(m<=0||n<=0) continue;
        if((a[m][n]>big)&&(a[m][n]<a[x][y]))
        {
            big=a[m][n];
            xx=m;
            yy=n;
        }
    }
    if(big==0) return 0;
    s++;
    x=xx;
    y=yy;
    return hsm();
}
int main()
{
    int r,c;
    cin>>r>>c;
    for(int i=1;i<=r;i++)
    {
        for(int j=1;j<=c;j++)
        {
            cin>>a[i][j];
            if(a[i][j]>maxn) 
            {
                maxn=a[i][j];
                x=i;
                y=j;
            }
        }
    }
    hsm();
    cout<<s;
    return 0;
}

想要几个样例......只有40分T_T


by ueettttuj @ 2019-07-16 12:10:18

@无形的狗子 找标程对拍


by 狄凡人 @ 2019-07-16 12:17:31

我没具体看哪里有问题,但是个人建议把全局变量和函数中的变量分开,即,在函数中尽量不要改变全局变量,这样检查起来比较方便


by xyy123456 @ 2019-07-16 12:23:30

你每次都从最高的点滑起,可这不一定是最佳策略啊,比如 1 2 3 4 9 1 2 3 1 2 3 4 1 2 3 4 9开始只能划2格 你要每个点都算一遍,用记忆化搜索应该不会超时


by xyy123456 @ 2019-07-16 12:27:33

@xyy123456 换行怎么不见了。。我输的时候是4*4的1 2 3 4;9 1 2 3;1 2 3 4;1 2 3 4;


by xyy123456 @ 2019-07-16 12:43:39

@无形的狗子 @你一下,不然你可能不会来看


by 无形的狗子 @ 2019-07-16 14:27:36

@xyy123456 是这个问题哦,谢谢,我再改。


by 无形的狗子 @ 2019-07-16 14:28:50

@狄凡人 好的,尽量。


by 无形的狗子 @ 2019-07-16 14:29:54

@ueettttuj 是找正确程序对应检查的意思吗?


by 无形的狗子 @ 2019-07-16 14:45:21

还是不对......

#include<iostream>
#include<cstdio>
using namespace std;
long long a[110][110],s=1,xx,yy,aa,bb,ans;
int h[5]={-1,0,0,1},l[5]={0,-1,1,0};
int hsm(int x,int y)
{
    int m,n;
    long long big=0;
    for(int k=0;k<4;k++)
    {
        m=x+h[k];
        n=y+l[k];
        if(m<=0||n<=0) continue;
        if((a[m][n]>big)&&(a[m][n]<a[x][y]))
        {
            big=a[m][n];
            xx=m;
            yy=n;
        }
    }
    if(big==0)
    {
        if(s>ans) ans=s;
        s=1;
        return 0;
    }
    s++;
    x=xx;
    y=yy;
    return hsm(x,y);
}
int main()
{
    int r,c;
    cin>>r>>c;
    for(int i=1;i<=r;i++)
        for(int j=1;j<=c;j++)
            cin>>a[i][j];
    for(int i=1;i<=r;i++)
    {
        for(int j=1;j<=c;j++)
        {
            aa=i;
            bb=j;
            hsm(aa,bb);
        }
    }
    cout<<ans;
    return 0;
}

by 无形的狗子 @ 2019-07-16 14:49:29

顺便弱弱问一下,这一题要用记忆化数组吗?本蒟蒻刚学完递归函数,不太懂。


| 下一页