大意:一个只包含 0 0 0 和 1 1 1 的矩形,边长为 n n n 和 m m m,求这个矩形中,最大的,其中 0 0 0 和 1 1 1 数量相等的矩形,如果有,输出最大矩形的面积,如果没有,则输出 0 0 0。
思路
先从此题数据范围部分入手,由于
n
,
m
≤
10
n,m \le 10
n,m≤10,数据量很小,所以我们只需要暴力枚举各个矩形的四个端点,并判断其合法性,再存储最大值即可得到答案。
解决方案
以下是枚举端点的代码,注意: i i i 代表矩形左上端点, j j j 代表矩形左下端点, k k k 代表矩形右上端点, l l l 代表矩形右下端点,且 i ≤ k i \le k i≤k 和 j ≤ l j \le l j≤l。
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
for(int k=i;k<n;k++)
for(int l=j;l<m;l++)
//枚举四个端点进行操作
然后判断矩阵是否合法。
bool check(int x1,int x2,int y1,int y2){
int wh=0;
int bl=0;
for(int i=x1;i<=x2;i++){
for(int j=y1;j<=y2;j++){
if(arr[i][j]=='0'){//由于是字符串输入,不能写 arr[i][j]==0
wh++;
}else{
bl++;
}
}
}
if(bl==wh){
return true;
}else{
return false;
}
}
注意,
c
h
e
c
k
check
check 函数的函数列表为先横后纵,在填写时要看仔细。
如果枚举的矩形符合要求,则用一个变量
m
a
x
x
maxx
maxx 来存储当前最大的合法矩形的面积。
//这是在 for 循环枚举时进行的操作
if(check(i,k,j,l)){
maxx=max(maxx,(k-i+1)*(l-j+1));
}
最后输出 m a x x maxx maxx 即可。
完整代码
#include<bits/stdc++.h>
using namespace std;
string arr[15];
int n,m,maxx=0;
bool check(int x1,int x2,int y1,int y2){
int wh=0;
int bl=0;
for(int i=x1;i<=x2;i++){
for(int j=y1;j<=y2;j++){
if(arr[i][j]=='0'){
wh++;
}else{
bl++;
}
}
}
if(bl==wh){
return true;
}else{
return false;
}
}
int main(){
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>arr[i];
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
for(int k=i;k<n;k++){
for(int l=j;l<m;l++){
if(check(i,k,j,l)){
maxx=max(maxx,(k-i+1)*(l-j+1));
}
}
}
}
}
cout<<maxx;
return 0;
}
标签:maxx,int,题解,wh,T1,bl,202406,矩形,check
From: https://blog.csdn.net/sugars_1216/article/details/140083182