做法是随机找点去找以这个点为右上角顶点的正方形的最大值和最小值,感觉挺容易卡的,求hack。
代码:
#include<bits/stdc++.h>
using namespace std;
mt19937 ran(19260817);
const int N=1010;
int mp[N][N],a,b,n;
bool vis[N][N];
int ans=INT_MAX;
int R(int l,int r){
return ran()%(r-l+1)+l;
}
int main(){
ios::sync_with_stdio(0);
cin>>a>>b>>n;
for(int i=1;i<=a;i++)
for(int j=1;j<=b;j++)
cin>>mp[i][j];
while(clock()<CLOCKS_PER_SEC*0.9){
int p=R(n,a),q=R(n,b);
if(vis[p][q]) continue;
vis[p][q]=1;
int mx=0,mi=1e9;
for(int i=p-n+1;i<=p;i++){
for(int j=q-n+1;j<=q;j++){
mx=max(mx,mp[i][j]);
mi=min(mi,mp[i][j]);
if(mx-mi>ans) break;
}
if(mx-mi>ans) break;
}
ans=min(ans,mx-mi);
}
cout<<ans;
return 0;
}