@[liwenxi110720](/user/661913)
先给两个能爆您代码的hack:
```
4 4
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
```
```
4 4
1 1 1 0
1 0 0 0
1 0 0 0
0 0 0 0
```
先自己试试,待会告诉您原因
by coldy_rainy @ 2022-12-28 16:54:02
@[liwenxi110720](/user/661913)
[AC](https://www.luogu.com.cn/record/98160477)代码:
```
#include<bits/stdc++.h>
using namespace std;
bool mapp[101][101];
int n,m,ans;
void dfs(int x,int y,int step){
if(x+step>n+1||y+step>m+1){
return ;
}
for(int i=x;i<=x+step;i++)
{
for(int j=y;j<=y+step;j++){
if(mapp[i][j]==0){
ans=max(ans,step);
return ;
}
}
}
dfs(x,y,step+1);
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>mapp[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(mapp[i][j]==1){
dfs(i,j,0);
}
}
}
cout<<ans;
return 0;
}
```
原因下述。
by coldy_rainy @ 2022-12-28 16:57:07
@[coldy_rainy](/user/526755)
感谢大佬,已AC
by liwenxi114514 @ 2022-12-28 17:06:35
@[liwenxi110720](/user/661913)
## 错误点1:
**错误代码**:`if(x+step>n||y+step>m){`
**正确代码**:`if(x+step>n+1||y+step>m+1){`
**样例**:如上面给出的第一个样例。
**原因**:在您的代码中,点的横纵坐标是从 $1$ 开始的。因为递归的边缘限制,$step$ 最大只能到 $n-x$ ,由于x>=1,所以正方形的边长只能到 $n-1$ ,即无法达到 $n$ ,所以当整个是个全 $1$ 的正方形时,就会出现错误(枚举不到整个)。
## 错误点2:
**错误代码**:
```
for(int i=x;i<=x+step;i++){
if(mapp[i][y]==0){
ans=max(ans,step);
return ;
}
}
for(int j=y;j<=y+step;j++){
if(mapp[x][j]==0){
ans=max(ans,step);
return ;
}
}
```
**正确代码**:
```
for(int i=x;i<=x+step;i++)
{
for(int j=y;j<=y+step;j++){
if(mapp[i][j]==0){
ans=max(ans,step);
return ;
}
}
}
````
**样例**:如上面的第二个样例。
**原因**:题目的要求是要枚举整个正方形,因此每个点都要进行判断。而在您的代码中,只对正方形的**左边和上面**进行了判断,所以像第二个样例那样的情况仍会输出 $3$ (自己重新看一下代码)。
有什么不懂的还可以找我。
by coldy_rainy @ 2022-12-28 17:14:34
@[liwenxi110720](/user/661913)
不谢
by coldy_rainy @ 2022-12-28 17:15:03
@[coldy_rainy](/user/526755)
那您能帮我看看这个代码错哪了吗?
[https://www.luogu.com.cn/discuss/548064](https://www.luogu.com.cn/discuss/548064)
by liwenxi114514 @ 2022-12-28 17:22:28