最大正方形
1 //找出一个01矩阵中最大的全为一的正方形,并输出边长 2 #include <iostream> 3 #include<cstdio> 4 #include<cstdlib> 5 #include<cmath> 6 #include<cstring> 7 #include<algorithm> 8 #include<cmath> 9 #define LL long long 10 using namespace std; 11 int mp[109][109]; 12 int f[109][109]; 13 int m,n; 14 15 int main() 16 { 17 cin>>n>>m; 18 for(int i=1;i<=n;i++) 19 { 20 for(int j=1;j<=m;j++) 21 { 22 cin>>mp[i][j]; 23 } 24 } 25 int res=0; 26 for(int i=1;i<=n;i++) 27 { 28 for(int j=1;j<=m;j++) 29 { 30 if(mp[i][j]) 31 f[i][j]=min(min(f[i-1][j],f[i][j-1]),f[i-1][j-1])+1;//若为一,则从三个方向中选个最小的(不然可能不符合题意) 32 else 33 f[i][j]=mp[i][j];//是0就填0 34 res=max(f[i][j],res); 35 } 36 } 37 cout<<res; 38 return 0; 39 }
创意吃鱼法
1 //类似于P1387最大正方形 2 //磁体是让你找出一个01矩阵中最大的单位方阵,输出边长 3 #include<iostream> 4 #include<cstring> 5 using namespace std; 6 const int N=3000; 7 bool mp[N][N]; 8 int s1[N][N],s2[N][N];//s1表示横向有多少个0,s2表示纵向有多少个0 9 int f[N][N];//方阵边长 10 int main(void) 11 { 12 std::ios::sync_with_stdio(false); 13 int n,m; 14 cin>>n>>m; 15 for(int i=1;i<=n;i++) 16 { 17 for(int j=1;j<=m;j++) 18 { 19 cin>>mp[i][j]; 20 } 21 } 22 //左上到右下 23 memset(s1,0,sizeof(s1)); 24 memset(s2,0,sizeof(s2)); 25 memset(f,0,sizeof(f)); 26 int ans=0; 27 for(int i=1;i<=n;i++) 28 { 29 for(int j=1;j<=m;j++) 30 { 31 if(mp[i][j]==0) 32 { 33 s1[i][j]=s1[i][j-1]+1; 34 s2[i][j]=s2[i-1][j]+1; 35 } 36 else 37 { 38 f[i][j]=min(f[i-1][j-1],min(s1[i][j-1],s2[i-1][j]))+1; 39 ans=max(ans,f[i][j]); 40 } 41 } 42 } 43 //右上到左下 44 memset(s1,0,sizeof(s1)); 45 memset(s2,0,sizeof(s2)); 46 memset(f,0,sizeof(f)); 47 for(int i=1;i<=n;i++) 48 { 49 for(int j=m;j>=1;j--) 50 { 51 if(mp[i][j]==0) 52 { 53 s1[i][j]=s1[i][j+1]+1;//此处当注意,右上到左下横向应该是加一 54 s2[i][j]=s2[i-1][j]+1; 55 } 56 else 57 { 58 f[i][j]=min(f[i-1][j+1],min(s1[i][j+1],s2[i-1][j]))+1; 59 ans=max(ans,f[i][j]); 60 } 61 } 62 } 63 cout<<ans<<endl; 64 return 0; 65 }