2013多校2的,找最大回文子矩阵的边长
ans从n和m最大的开始,依次减小,找是否存在ans的正方形
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#define inf 0x3f3f3f3f
using namespace std;
int ma[305][305];
int T,n,m;
int is(int k)
{
int flag,left,mid,i,j,p,x;
mid=k/2;
for(i=1;i<=n-k+1;i++)
{
for(j=1;j<=m-k+1;j++)
{
flag=1;
left=i+k-1;
for(p=j;p<=j+k-1;p++)
{
for(x=0;x<mid;x++)
{
if(ma[x+i][p]!=ma[left-x][p])
{
flag=0;
break;
}
}
if(flag==0) break;
}
if(flag==0) continue;
left=j+k-1;
for(p=i;p<=i+k-1;p++)
{
for(x=0;x<mid;x++)
{
if(ma[p][x+j]!=ma[p][left-x])
{
flag=0;
break;
}
}
if(flag==0) break;
}
if(flag==1) return 1;
}
}
return 0;
}
int main()
{
int i,j,ans;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
scanf("%d",&ma[i][j]);
ans=min(n,m);
while(ans>1)
{
if(is(ans))
{
break;
}
ans--;
}
printf("%d\n",ans);
}
return 0;
}