点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;
}