题目描述:
某个棋盘有rows行cols列。棋盘上的每个格子都上有黑色或白色棋子。现在想要找出黑棋区域最大的正方形面积。例如某棋盘的状态如图所示。
在该棋盘中黑棋区域最大的正方形为3×3(阴影区域) , 即最大面积为9。小明编写程序求解该问题。用二维数组matrix表示棋盘, 在数组中用1表示黑色棋子,用0表示白色棋子。
输入格式:
第一行两个数表示行rows与列cols
第二行开始给定一个rows * cols的01矩阵,两个数之间用一个空格隔开
输出格式:
一个整数表示最大的正方形面积。
样例输入:
8 10
0 1 1 0 0 0 1 1 0 0
1 1 0 1 0 1 1 0 0 0
0 1 1 1 0 1 1 1 1 0
0 1 1 1 1 1 0 0 1 0
1 1 1 1 1 1 0 0 1 1
1 0 1 1 0 1 1 1 1 0
0 1 0 0 1 1 1 0 1 0
0 1 1 0 1 1 1 1 1 1
样例输出:
9
时间限制: 1000ms
空间限制: 256MB
代码如下:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int a[1001][1001]={};
int n,m,xmax=0;
intmain(){
cin>>n>>m;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>a[i][j];
}
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(a[i][j]==1){
int k=0;
while(1){
int flag=0;
for(int x=i;x<=i+k;x++){
for(int y=j;y<=j+k;y++){
if(a[x][y]==0){
flag++;
}
}
}
if(flag==0){
k++;
}else{
int s=(k)*(k);
if(s>xmax) xmax=s;
break;
}
}
}
}
}
cout<<xmax;
return 0;
}