卡了一天了,没看出来问题出在哪里,求条qwq
#include <iostream>
#include <cmath>
#include <cstring>
#define re return
#define mem memset
using namespace std;
const int MAXX = 500 + 11;
const int inf = 2147483647;
int map[MAXX][MAXX];
int xx[4] = {-1,0,1,0},yy[4] = {0,1,0,-1};
int vis[MAXX][MAXX];
int l[MAXX][MAXX],r[MAXX][MAXX]; // 区间
int n,m;
void dfs(int x,int y) {
vis[x][y] = 1;
for (int i = 0; i < 4; i ++) {
int nx = x + xx[i];
int ny = y + yy[i];
if (nx >= 1 and nx <= n and ny >= 1 and ny <= m) {// 越界
if (!vis[nx][ny] and map[nx][ny] < map[x][y]) {
dfs(nx,ny);
}
}
l[x][y] = min(l[x][y],l[nx][ny]); // 左区间尽量向左
r[x][y] = max(r[x][y],r[nx][ny]); // 同理
}
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i ++) {
for (int j = 1; j <= m; j ++) {
scanf("%d",&map[i][j]);
}
}
mem(l,inf,sizeof(l));
for (int i = 1; i <= m; i ++) {
l[n][i] = r[n][i] = i; // 初始状态
}
for (int i = 1; i <= m; i ++) {
if (!vis[1][i]) {
dfs(1,i);
}
}
bool flag = 0;
int sum = 0;
for (int i = 1; i <= m; i ++) {
if (!vis[n][i]) { // 不可以!
flag = 1;
sum ++;
}
}
if (flag) {
puts("0");
cout << sum << endl;
re 0;
}
int L = 1;
while (L <= m) {
int R = 0;
for (int i = 1; i <= m; i ++) {
if (l[1][i] <= L) {
R = max(R,r[1][i]);
}
}
sum ++;
L = R + 1;
}
puts("1");
cout << sum << endl;
re 0;
}