把方形矩阵里面的数字转化成字符串后数字间加空格存储,一个string即可代表一个子矩阵。
用set存储,查询每个子矩阵即可。
空间复杂度: n5×10=3.125×109.
理论上会超,but AC.
#include<bits/stdc++.h>
using namespace std;
int n,a[55][55];
set<string> st;
int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)cin>>a[i][j];
}
for(int z=1;z<=n;z++){
for(int i=1;i<=n-z+1;i++){
for(int j=1;j<=n-z+1;j++){
string s="";
for(int k=i;k<=i+z-1;k++){
for(int l=j;l<=j+z-1;l++){
int x=a[k][l];
while(x){
s+=(x%10)+'0';
x/=10;
}
s+=' ';
}
}
st.insert(s);
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)cin>>a[i][j];
}
int ans=0;
for(int z=1;z<=n;z++){
for(int i=1;i<=n-z+1;i++){
for(int j=1;j<=n-z+1;j++){
string s="";
for(int k=i;k<=i+z-1;k++){
for(int l=j;l<=j+z-1;l++){
int x=a[k][l];
while(x){
s+=(x%10)+'0';
x/=10;
}
s+=' ';
}
}
if(st.find(s)!=st.end()){
ans=z;
}
}
}
}
cout<<ans<<endl;
return 0;
}
望卡。