
String 不能写错int i0 检查0不是字母o求max或min的时候用大写Math.max/min蓝桥杯最大正方形 暴力法核心知识点易错点总结一、题型核心说明暴力法适用题目给出二维0-1矩阵要求找出只由1组成的最大正方形返回边长或面积。暴力法是新手最容易理解、考场好上手的写法不用记动态规划公式适合矩阵规模不大的蓝桥杯基础题核心思路是枚举所有可能的正方形逐一验证是否全为1记录最大边长。二、暴力法核心知识点必背1. 暴力法核心逻辑三层循环枚举内层验证全程围绕“正方形左上角坐标边长”展开第一层循环枚举正方形左上角的行坐标i遍历矩阵每一行第二层循环枚举正方形左上角的列坐标j遍历矩阵每一列第三层循环枚举正方形边长k从1开始逐步增大尝试所有可能的边长内层验证检查以(i,j)为左上角、边长为k的正方形内部所有元素是否全为1只要找到全1的正方形就更新最大边长最终得到的最大边长即为答案面积最大边长×最大边长。2. 暴力法完整解题步骤获取矩阵基础信息先读入矩阵行数row和列数col初始化最大边长maxSide0初始无正方形边长为0。枚举左上角坐标外层双重循环遍历每一个位置(i,j)作为正方形的左上角起点。控制边长范围枚举边长k时要保证正方形不超出矩阵边界即ik ≤ row 且 jk ≤ col避免越界。全1验证针对当前左上角和边长遍历正方形内部所有行和列逐个检查元素是否为1只要出现0立刻停止当前边长的验证。更新最大边长如果当前边长k的正方形全为1且k大于已记录的maxSide就更新maxSidek。输出结果遍历结束后输出maxSide边长或输出maxSide*maxSide面积。3. 关键边界规则单个1也是边长为1的正方形初始最大边长不能直接忽略边长必须是正整数最小边长为1最大可能边长为矩阵行数和列数里的较小值避免正方形超出矩阵。#includebits/stdc.h using namespace std; int n,m; int a[105][105]; int sum; int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin n m; for(int i1;in;i){ for(int j1;jm;j){ cin sum; a[i][j] a[i-1][j] a[i][j-1] -a[i-1][j-1] sum; } } int minn min(m,n); for(int qminn;q0;q--){ for(int iq;in;i){ for(int jq;jm;j){ if(a[i][j] a[i-q][j-q] - a[i-q][j] - a[i][j-q] q*q){ cout q; return 0; } } } } cout 1; return 0; }三、暴力法高频易错点避坑必看1. 数组下标越界最常错❌ 错误边长k枚举过大导致正方形右下角超出矩阵范围循环时访问到不存在的下标。 ✅ 正确严格判断i k ≤ 总行数且j k ≤ 总列数超出边界立刻停止当前边长的枚举。2. 全1验证逻辑错误❌ 错误只检查部分元素没遍历正方形内所有位置或者遇到0不跳出循环继续无效验证。 ✅ 正确双层循环遍历正方形内每一个元素只要发现一个0直接标记为无效退出内层验证循环。3. 最大边长初始值与更新错误❌ 错误初始maxSide赋值为1矩阵全0时结果错误或者找到更大边长后不更新始终保留初始值。 ✅ 正确初始maxSide0只有找到全1正方形时才对比并更新为更大的边长。4. 循环顺序混乱❌ 错误先枚举边长再枚举坐标导致重复验证、漏验证部分正方形。 ✅ 正确固定顺序先枚举左上角坐标(i,j)再枚举边长k逐个位置尝试所有可能边长。5. 输入处理与类型问题❌ 错误读入的字符0/1直接和数字0/1比较结果恒不相等二维矩阵行列赋值错乱。 ✅ 正确字符转数字用Integer.parseInt()或直接按整数读取保证矩阵内存储的是纯数字0和1。6. 忽略单个1的情况❌ 错误只检查边长≥2的正方形矩阵只有单个1时返回0结果错误。 ✅ 正确边长从1开始枚举单个1属于有效正方形正常更新最大边长。