完全没思路...
#include<bits/stdc++.h>
#define MAXN 505
#define MAXM 505
struct node{
int n,m;
};//储存城市坐标
int dx[]={-1,0,1,0};
int dy[]={0,-1,0,1};//方向数组
int n,m,cnt;
int h[MAXN][MAXM];//海拔
bool vis[MAXN][MAXM];//判断是否已访问
queue<node>que;
using namespace std;
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>h[i][j];
for(int i=1;i<=m;i++){
vis[1][i]=1;
que.push({1,i});
}//储水站
while(!que.empty()){
node a=que.front();
int i=a.n,j=a.m;
for(int k=0;k<4;k++){
if(i+dx[k]>=1&&i+dx[k]<=n&&j+dy[k]>=1&&j+dy[k]<=m){
if(h[i][j]>=h[i+dx[k]][j+dy[k]]&&vis[i+dx[k]][j+dy[k]]==0){
vis[i+dx[k]][j+dy[k]]=1;
que.push({i+dx[k],j+dy[k]});
}
}
}//bfs判断(i,j)能否建输水站
que.pop();
}
for(int i=1;i<=m;i++)
cnt+=vis[n][i];//第n排能否建水利设施
if(cnt!=m){
cout<<m-cnt<<"\n";
return 0;
}
else{
//计算最少建造几个蓄水厂
//不会写QwQ
}
return 0;
}