MnZn求助,样例过不了,提交上去WA了三个点

P1434 [SHOI2002] 滑雪

哲学♂王子 @ 2021-02-21 18:20:17

Rt,样例输入:

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

错误出在“19”的位置上。

看了下,在运行到“19”这个位置的时候,以每个点为起点的最长长度应该是这样的:

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

然而我的代码却跑成了这样:

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

想了半个小时也没想出错误的地方,看了题解也不懂。提交上去,WA了#3,#9,#10点。

求大佬帮忙康康代码qwq:

#include<bits/stdc++.h>
using namespace std;
int R,C,Snow[105][105],View[105][105],s,x,z,y,An;
bool Pd[105][105];
int Play(int a,int b);
int main()
{
    scanf("%d%d",&R,&C);
    for(int i=1;i<=R;i++)
        for(int j=1;j<=C;j++)
        {
            scanf("%d",&Snow[i][j]);
            View[i][j]=1;
        }
    for(int i=1;i<=R;i++)
        for(int j=1;j<=C;j++)
        {
            View[i][j]=Play(i,j);
            An=max(An,View[i][j]);
        }
    printf("%d",An);
    return 0;
}
int Play(int a,int b)
{
    s=x=z=y=0;
    if(Pd[a][b]==true)
        return View[a][b];
    if(a!=1&&Snow[a-1][b]<Snow[a][b])
    {
        s=Play(a-1,b)+1;
        View[a-1][b]=s-1;
        Pd[a-1][b]=true;
    }
    if(a!=R&&Snow[a+1][b]<Snow[a][b])
    {
        x=Play(a+1,b)+1;
        View[a+1][b]=x-1;
        Pd[a+1][b]=true;
    }
    if(b!=1&&Snow[a][b-1]<Snow[a][b])
    {
        z=Play(a,b-1)+1;
        View[a][b-1]=z-1;
        Pd[a][b-1]=true;
    }
    if(b!=C&&Snow[a][b+1]<Snow[a][b])
    {
        y=Play(a,b+1)+1;
        View[a][b+1]=y-1;
        Pd[a][b+1]=true;
    }
    Pd[a][b]=true;
    int A=max(View[a][b],s);
    A=max(A,x);
    A=max(A,z);
    A=max(A,y);
    return A;
}

谢谢大佬,不胜感激。


by tongziyu @ 2021-02-23 07:35:13

你新建四个变量,在Play函数的每个if语句后面存一下s,x,y,z,然后A最后去比较那四个变量和View[a][b]就能AC了


by tongziyu @ 2021-02-23 07:39:08

int Play(int a,int b)
{
    int u,d,l,r;
    s=x=z=y=0;
    if(Pd[a][b]==true)
        return View[a][b];
    if(a!=1&&Snow[a-1][b]<Snow[a][b])
    {
        s=Play(a-1,b)+1;
        View[a-1][b]=s-1;
        Pd[a-1][b]=true;
    }
    u=s;
    if(a!=R&&Snow[a+1][b]<Snow[a][b])
    {
        x=Play(a+1,b)+1;
        View[a+1][b]=x-1;
        Pd[a+1][b]=true;
    }
    d=x;
    if(b!=1&&Snow[a][b-1]<Snow[a][b])
    {
        z=Play(a,b-1)+1;
        View[a][b-1]=z-1;
        Pd[a][b-1]=true;    
    }
    l=z;
    if(b!=C&&Snow[a][b+1]<Snow[a][b])
    {
        y=Play(a,b+1)+1;
        View[a][b+1]=y-1;
        Pd[a][b+1]=true;

    }
    r=y;
    Pd[a][b]=true;
    int A=max(View[a][b],u);
    A=max(A,d);
    A=max(A,l);
    A=max(A,r);
    return A;
}

by 哲学♂王子 @ 2021-02-23 12:54:26

@tongziyu 谢谢大佬qwq!


|