直接爆,找到0之后 作为第一行中点,然后枚举终点,就可以得出,然后判断这个图形是否符合要求

#include <algorithm>
#include <cstring>
#include <cstdio>

using std::max;
int map[110][110];
int n;
int solve(int x, int st, int ed)
{
    int len=ed-st;
    if(x+len+len>n)
        return 0;
    if(st<len-1)
        return 0;
    int k=1;
    for(int i=x; i<x+len; i++)
    {
        for(int j=st; j<st+k; j++)
            if(map[i][j]) return 0;
        for(int j=st+k; j<=st+len; j++)
            if(!map[i][j]) return 0;
        for(int j=st; j>st-k; j--)
            if(map[i][j]) return 0;
        for(int j=st-k; j>=st-len; j--)
            if(!map[i][j]) return 0;
        k++;
    }
    for(int i=st-len; i<=st+len; i++)
        if(map[x+len][i]) return 0;
    k=1;
    for(int i=x+len+1; i<=x+2*len; i++)
    {
        for(int j=st-len; j<st-len+k; j++)
            if(!map[i][j]) return 0;
        for(int j=st-len+k; j<=st; j++)
            if(map[i][j])return 0;
        for(int j=st+len; j>st+len-k; j--)
            if(!map[i][j]) return 0;
        for(int j=st+len-k; j>=st; j--)
            if(map[i][j]) return 0;
        k++;
    }
    return len;
}
int main()
{
    while(scanf("%d",&n)==1 && n)
    {
        for(int i=0; i<n; i++)
            for(int j=0; j<n; j++)
                scanf("%d",&map[i][j]);
        int ans=0;
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<n; j++)
            {
                if(map[i][j])
                    continue;
                for(int k=j+1; k<n; k++)
                    ans=max(ans, solve(i,j,k));
            }
        }
        if(!ans)
            puts("No solution");
        else
            printf("%d\n",ans*2+1);
    }
    return 0;
}
View Code

 

posted on 2013-08-05 15:32  风流monkey  阅读(197)  评论(0)    收藏  举报