直接爆,找到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; }
浙公网安备 33010602011771号