求助求助,有一个过不去

P1434 [SHOI2002] 滑雪

StSnow @ 2022-03-18 19:56:02

思路是不断遍历数组,开3维数组三个二维数组,一个放高度,一个记录状态。 不断循环遍历, 第一次的时候,如果一个位置的四周高度均高于它,则状态为0,否则为1; 之后只在状态为1的地方比较,不断取成0,直到全为0时,循环次数就是最长的坡度。 简单地说就是不断相互比较。 只有第二个数据点超时了,搞不明白,求教大佬。

附上代码------------

'''cpp
#include <iostream>
using namespace std;

bool can(int ***arr ,int a,int b,int m,int n);

int main(){
    int m ,n ,***matrix ,i ,j ,count,out=0;
    matrix=new int**[3];
    cin>>m>>n ;
    matrix[0]=new int*[m];
    matrix[1]=new int*[m];
    matrix[2]=new int*[m];
    for (i=0 ;i<m ;i++ ){
        matrix[0][i]=new int[n];
        matrix[1][i]=new int[n];
        matrix[2][i]=new int[n];
        for (j=0 ;j<n ;j++) {
            cin>>matrix[0][i][j];
            matrix[1][i][j]=1;
            matrix[2][i][j]=1;
        }
    }

    do{
        out++;
        count=0;
        for (i=0 ;i<m ;i++){
            for (j=0 ;j<n ;j++ ){
                if (can(matrix,i,j,m,n)) count++;
                else matrix[1][i][j]=0;
            }
        }
        for (i=0 ;i<m ;i++ )
            for (j=0 ;j<n ;j++ ) matrix[2][i][j]=matrix[1][i][j];
    }while(count);
    cout<<out;
    for (i=0 ;i<m ;i++){
        for (j=0 ;j<3 ;j++ ) delete[] matrix[j][i];
    }
    for (i=0 ;i<3 ;i++ ) delete[] matrix[i];
    delete[] matrix;
    return 0;
}

bool can(int ***arr ,int a,int b,int m,int n){
    if (a>0 && arr[0][a-1][b]<arr[0][a][b] && arr[2][a-1][b]==1) return true;
    else if (a<m-1 && arr[0][a+1][b]<arr[0][a][b] && arr[2][a+1][b]==1) return true;
    else if (b>0 && arr[0][a][b-1]<arr[0][a][b] && arr[2][a][b-1]==1) return true;
    else if (b<n-1 && arr[0][a][b+1]<arr[0][a][b] && arr[2][a][b+1]==1) return true;
    return false;
}
                                              '''

by x1902129897 @ 2022-03-22 00:53:13

大佬我可以问下为什么map数组中为什么是a[x][y]在变而不是a[y][x]在变啊


by x1902129897 @ 2022-03-22 00:55:02

@x1902129897 a[x][y]>a[xx][yy])而不是a[y][x]>a[yy][xx])


|