wa*2求助

P1434 [SHOI2002] 滑雪

学习柯学 @ 2022-07-19 20:40:14

#include<iostream>
#include<cmath>
using namespace std;
int n, m, a[105][105], b[105][105],f[105][105], i, j, ans;
int dfs(int x, int y)
{
    int mmax = -1;
    if (f[x][y])
        return b[x][y];
    else {
        if (a[x + 1][y] != 0 && a[x + 1][y] < a[x][y] && x + 1 != n + 1)
            mmax=max( dfs(x + 1, y) + 1, mmax);
        if (a[x - 1][y] != 0 && a[x - 1][y] < a[x][y] && x - 1 != n + 1)
            mmax = max(dfs(x - 1, y) + 1, mmax);
        if (a[x][y + 1] != 0 && a[x][y + 1] < a[x][y] && y + 1 != m + 1)
            mmax = max(dfs(x, y + 1) + 1, mmax);
        if (a[x][y - 1] != 0 && a[x][y - 1] < a[x][y] && y - 1 != m + 1)
            mmax = max(dfs(x, y - 1) + 1, mmax);
        if (mmax == -1)
            mmax = 1;
        b[x][y] = mmax;
        f[x][y] = 1;
        return b[x][y];
    }
}
int main() {
    cin >> n >> m;
    for (i = 1; i <= n; i++)
    {
        for (j = 1; j <= m; j++)
        {
            cin >> a[i][j];
        }
    }
    for (i = 1; i <= n; i++)
    {
        for (j = 1; j <= m; j++)
        {
            ans = max(dfs(i,j), ans);
        }
    }
    cout << ans;
    return 0;
}

第五个点和第七个点wa了。。。。


by miaonei214 @ 2022-08-06 17:45:13

你的代码我改了一下,有些多余与错误的东西,删删改改已经过了。逻辑没问题,但是那四个方向的条件判断有问题(条件二和四,对应坐标变小,却与最大值比较),而且最关键的一点,这题的数据没提示a的高度可以为0。这个就导致了判断下一步是否越界时不能单纯的看该坐标高度是否为未赋值的“0”。 所以把判断是否越界的条件改为该坐标的横纵坐标是否超出界限就可以了; 具体四条件改为如下: 1.if (a[x + 1][y] < a[x][y] && x != n) 2.if (a[x - 1][y] < a[x][y] && x - 1 != 0) 3.if (a[x][y + 1] < a[x][y] && y != m) 4.if (a[x][y - 1] < a[x][y] && y - 1 != 0) 其余的不动,就可以了。


by 学习柯学 @ 2022-08-08 14:37:10

@miaonei214 已经过了,谢谢大佬 %%%%%


|