#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<map>
#include<unordered_map>
#include<vector>
#define x1 xx1
#define y1 yy1
using namespace std;
inline int R(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}return x*f;
}
inline void write(int x){
if(x<0){x=-x;putchar('-');}
int y=0;char z[70];
while(x||!y){z[y++]=x%10+48;x/=10;}
while(y--)putchar(z[y]);
}
inline void writesp(int x){
if(x<0){x=-x;putchar('-');}
int y=0;char z[70];
while(x||!y){z[y++]=x%10+48;x/=10;}
while(y--)putchar(z[y]);putchar(32);
}
inline void writeln(int x){
if(x<0){x=-x;putchar('-');}
int y=0;char z[70];
while(x||!y){z[y++]=x%10+48;x/=10;}
while(y--)putchar(z[y]);putchar(10);
}
inline char read(){
char ch=getchar();
while(1) ch=getchar();
return ch;
}
const int N=505;
int n,m,a[N][N],cnt[N][N];
int mx1[N*N],mx2[N*N],mn1[N*N],mn2[N*N];
int main(){
n=R(),m=R();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
a[i][j]=R();
for(int i=1;i<=n*n;i++) mx1[i]=mx2[i]=0,mn1[i]=mn2[i]=n+1;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
mx1[a[i][j]]=max(mx1[a[i][j]],i);
mx2[a[i][j]]=max(mx2[a[i][j]],j);
mn1[a[i][j]]=min(mn1[a[i][j]],i);
mn2[a[i][j]]=min(mn2[a[i][j]],j);
}
int num=0;
for(int i=1;i<=n*n;i++)
if(mx1[i])
num++;
if(num<=m){
write(m-num);
return 0;
}
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cnt[i][j]=0;
for(int i=1;i<=n*n;i++){
if(mx1[i]){
int max1=max(mx1[i]-k+1,1);
int min1=min(mn1[i],n-k+1);
int max2=max(mx2[i]-k+1,1);
int min2=min(mn2[i],n-k+1);
if(max1<=min1&&max2<=min2){
cnt[max1][max2]++;
cnt[min1+1][min2+1]++;
cnt[max1][min2+1]--;
cnt[min1+1][max2]--;
}
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cnt[i][j]+=cnt[i-1][j]+cnt[i][j-1]+cnt[i-1][j-1];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(m==num-cnt[i][j]||m==num-cnt[i][j]+1){
puts("1");
return 0;
}
}
puts("2");
}
求调,一上午交了20发罚时