#include <bits/stdc++.h>
using namespace std;
int r,c,k;
struct s{
int num[10];
s operator+(const s s2)const{
s ret;
for (int i=1;i<=k;i++){
ret.num[i]=num[i]+s2.num[i];
}
return ret;
}
s operator-(const s s2){
s ret;
for (int i=1;i<=k;i++){
ret.num[i]=num[i]-s2.num[i];
}
return ret;
}
};
int a[2505][2505];
s sum[2505][2505];
int cnt[6250005];
bool check(s s1){
for (int i=1;i<=k;i++) if (s1.num[i]&&s1.num[i]!=cnt[i]) return false;
return true;
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin>>r>>c>>k;
for (int i=1;i<=r;i++) {
for (int j=1;j<=c;j++) {
cin>>a[i][j];
cnt[a[i][j]]++;
sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];
sum[i][j].num[a[i][j]]++;
}
}
int ans=0;
for (int i=1;i<=r;i++){
for (int j=1;j<=r;j++){
for (int l=ans+1;i>=l&&j>=l;l++){
if (check(sum[i][j]-sum[i-l][j]-sum[i][j-l]+sum[i-l][j-1])) {
ans=l;
}
}
}
}
cout<<ans;
}
站外题,但是第一次执行完check函数后l就突然变成一个很小的数,这是啥问题啊,一天头绪没有。 测试样例:
5 8 10
1 6 6 6 6 6 7 7
1 1 1 6 8 4 4 7
2 2 2 9 3 4 4 7
2 5 2 9 3 3 4 7
2 2 2 2 10 10 7 7