大佬们,60pts

P1387 最大正方形

@[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


|