60pts 求助大佬
查看原帖
60pts 求助大佬
611405
JAs0n楼主2022/9/23 13:40

点1,5,7,8 WA

其余 AC

求助大佬

//https://www.luogu.com.cn/problem/P1434

#include <bits/stdc++.h>
using namespace std;

const int maxn = 105;

int x_n;
int y_n;
int hi[maxn][maxn];
int dif[maxn][maxn][4];
int max_x,max_y,max_n;
int ans;

void read() {
    scanf("%d",&x_n);scanf("%d",&y_n);
    for (int i = 1; i <= x_n; i++) for (int j = 1; j <= y_n; j++) {
        cin >> hi[i][j];
        if (hi[i][j] > max_n) {
            max_n = hi[i][j];
            max_x = i;
            max_y = j;
        }
    }
}

void pre() {
    for (int i = 1; i <= x_n; i++) for (int j = 1; j <= y_n; j++) {
        if ((hi[i][j-1] != 0)&&(hi[i][j] > hi[i][j-1])) dif[i][j][0] = hi[i][j] - hi[i][j-1]; //上
        if ((hi[i][j+1] != 0)&&(hi[i][j] > hi[i][j+1])) dif[i][j][1] = hi[i][j] - hi[i][j+1]; //下
        if ((hi[i-1][j] != 0)&&(hi[i][j] > hi[i-1][j])) dif[i][j][2] = hi[i][j] - hi[i-1][j]; //左
        if ((hi[i+1][j] != 0)&&(hi[i][j] > hi[i+1][j])) dif[i][j][3] = hi[i][j] - hi[i+1][j]; //右
    }
}

int work(int x, int y, int n) {
    int now_min = INT_MAX;
    int now = -1;
    for (int i = 0; i < 4; i++) { //遍历四个方向
        if ((dif[x][y][i] < now_min)&&(dif[x][y][i] != 0)) {
            now = i;
            now_min = dif[x][y][i];
        }
    }
    if (now == -1) return n;
    if (now == 0) return work(x,y-1,n+1);
    if (now == 1) return work(x,y+1,n+1);
    if (now == 2) return work(x-1,y,n+1);
    if (now == 3) return work(x+1,y,n+1);
}

int main()
{
    read();
    pre();
    for (int i = 1; i <= x_n; i++) for (int j = 1; j <= y_n; j++) {
        ans = max(ans,work(i,j,1));
    }
    cout << ans;
    return 0;
}
2022/9/23 13:40
加载中...