二维数组传入为函数参数的时候必须指定第二维长度。而且不能传入变量。就很离谱。但是这并不能阻挡我要用递归的心。
做题思路
- 题目分解:
- 输入。就是一个普通的二维数组输入。这里因为只有两种情况可以直接写为bool数组(空间能少一点就少一点)
- 判断。因为是需要一个正方形的面积。那么最大的肯定就是r,c中较小数的平方,即r2r^2r2或者是c2c^2c2。这也是最大的可能面积。判断是否纯色即在这个区域内是否数组值相同即可。
- 最优解。若最大的不行则以此减少1的边长判断是否满足情况。遍历判断时就需要按照一定顺序依此划分正方形。这个过程高度相似,直接封装成一个函数即可。
- 实现思路:
-
最开始就是得要有一个开始的x,y作为判断的标准。然后就是注意下标别越界了。
-
我的实现思路就是按照从左到右,从上到下的顺序判断。如果不满足条件且划分的正方形并没有把给定矩形的水平长度用完则开始的starty不变,startx++(就是把需要判断的小正方形水平移动)。如果该正方形已经碰到侧边且没有满足条件就startx恢复初始0,starty++(小正方形回到向下移动)。再不行就减少正方形的边长(代码中edge)
-
AC代码
在递归变量需要++或者–时,需要前置,否则就会死循环。如fun(++a)
#include <bits/stdc++.h>
using namespace std;
bool brick[200][200];
int tdog(int,int,int,int,int);
int main()
{
int r,c;
cin>>r>>c;
//(r,c)
for(int i=0;i<r;i++){
for(int j=0;j<c;j++){
cin>>brick[i][j];
}
}
//感觉还是递归好用
//坏了,怎么传二维数组,归不动了
//归,都可以归。没有条件,创造条件也要递归!
int edge;
if(r>=c){
edge=c;
}
else{
edge=r;
}
int res=tdog(r,c,edge,0,0);
cout<<res<<endl;
//从最大开始判断吧
return 0;
}
int tdog(int r,int c,int edge,int startx,int starty)
{
bool st=brick[starty][startx];
for(int i=starty;i<starty+edge&&starty+edge<=r;i++){
for(int j=startx;j<startx+edge&&startx+edge<=c;j++){
if(brick[i][j]!=st){
if(startx+edge==c&&starty+edge==r){
return tdog(r,c,--edge,0,0);
}
else{
if(startx+edge==c){
return tdog(r,c,edge,0,++starty);
}
else if(starty+edge==r){
return tdog(r,c,--edge,0,0);
}
else{
return tdog(r,c,edge,++startx,starty);
}
}
}
}
}
return (edge*edge);
}
&spm=1001.2101.3001.5002&articleId=111182866&d=1&t=3&u=d3277a613dab4fb9bce026eab23c3364)
1121

被折叠的 条评论
为什么被折叠?



