3个for循环枚举正方形的边长和中心点的坐标然后判断是否满足条件就可以了。判断时一开始写乱了。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#define MAXN 110
using namespace std;
int map[MAXN][MAXN];
int n;
int abs(int x,int y)
{
if(x<y) return y-x;
else return x-y;
}
int check(int x,int y,int w)
{
if(y-w<1||y+w>n||x-w<1||x+w>n) return 0;
for(int i=y-w; i<=y+w; i++)
{
for(int j=x-w; j<x-w+abs(i-y); j++)
if(map[j][i]==0) return 0;
for(int j=x-w+abs(i-y); j<=x+w-abs(i-y); j++)
if(map[j][i]==1) return 0;
for(int j=x+w; j>x+w-abs(i-y); j--)
if(map[j][i]==0) return 0;
}
return 1;
}
int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%d",&n)!=EOF&&n)
{
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
scanf("%d",&map[i][j]);
}
int flag=0;
for(int k=(n%2==0?n-1:n); k>=3; k-=2)
{
for(int i=1; i<n; i++)
{
for(int j=1; j<n; j++)
{
if(map[i][j]==0&&check(i,j,k/2))
{
flag=1;
cout<<k<<endl;
break;
}
if(flag) break;
}
if(flag) break;
}
if(flag) break;
}
if(!flag) cout<<"No solution\n";
}
return 0;
}