找方块
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 80 Accepted Submission(s): 14
Problem Description
小明最近看到一件艺术品,是由许多黑白方块组成的矩形图,但是并不是黑白相间的。小明希望找到一个最大的黑白相间的矩形。
Input
第一行输入T(T<=10)。
接下来输入T组数据,每组数据第一行为N,表示这个艺术品的矩阵大小是N * N(N <=100)。
接下来是一个N * N的矩阵,0代表黑色,1代表白色。
接下来输入T组数据,每组数据第一行为N,表示这个艺术品的矩阵大小是N * N(N <=100)。
接下来是一个N * N的矩阵,0代表黑色,1代表白色。
Output
对于每组数据,输出最大的黑白相间矩形的面积。
每组输出占一行。
每组输出占一行。
Sample Input
1 2 0 1 1 0
Sample Output
4
简单遍历
从每一个点开始向右下寻找最大矩阵,先让长最大得到1*n矩形,逐渐增加行数减小长度增加宽度直至宽度无法增加
注意增加宽度时长度为所有行中最小长度。
#include<iostream>
using namespace std;
int p[105][105];
int main(){
int t;
cin>>t;
while(t--){
int n;
cin>>n;
int area=0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)cin>>p[i][j];
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
int down=i;
int right=j;
for(int k=i+1;k<n;k++){
if(p[k][j]!=p[k-1][j])down++;
else break;
}
for(int k=j+1;k<n;k++){
if(p[i][k]!=p[i][k-1])right++;
else break;
}
for(int k=i;k<=down;k++){
bool flag=true;
for(int l=j+1;l<=right;l++){
if(p[k][l]==p[k][l-1]){
int narea=(l-1-j+1)*(k-i+1);
if(narea>area)area=narea;
right=l-1;
flag=false;
break;
}
}
if(flag){
int narea=(right-j+1)*(k-i+1);
if(narea>area)area=narea;
}
}
}
}
cout<<area<<endl;
}
}