hiho一下 第222周 Big Plus
阿新 • • 發佈:2018-12-13
題面 :
題意:
很簡單,直接看圖。
思路:
開始以為一個dfs暴力莽過,看討論利用字首和思想,先預處理每一點向四個方向有最多多少個連續點,取最小值即答案。時間複雜性O(n^2)。具體見程式碼!
程式碼
#include<bits/stdc++.h>
using namespace std;
const int maxn = 500+50;
int n,mat[maxn][maxn];
int Up[maxn][maxn],Down[maxn][maxn],Left[maxn][maxn],Right[maxn][maxn];
int main(){
while(~scanf ("%d",&n)){
memset(Up,0,sizeof(Up));
memset(Down,0,sizeof(Down));
memset(Left,0,sizeof(Left));
memset(Right,0,sizeof(Right));
for(int i=1;i<=n;i++){
char s[n+1];
scanf("%s",s+1);
for(int j=1;j<=n;j++){
mat[i][j] = s[j] - '0';
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(mat[i][j]==1){
Left[i][j] = Left[i][j-1] + 1;
Up[i][j] = Up[i-1][j] + 1;
}
if(mat[i][n-j+1]==1){
Right[i][n-j+1] = Right[i][n-j+2] + 1;
}
if(mat[ n-i+1][j] == 1){
Down[n-i+1][j] = Down[n-i+2][j] + 1;
}
}
}
int ans = 0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(mat[i][j]==1){
ans = max(ans,min(min(Up[i][j],Down[i][j]), min(Left[i][j],Right[i][j]))-1);
}
}
}
printf("%d\n",ans);
}
}