行优先遍历
课件用 3 行 4 列的 int g[3][4] 演示:外层 i 走行、内层 j 走列,先把一行从左扫到右,再跳下一行——for i { for j { 处理 g[i][j] } }。这条路径正好和 C 二维数组在内存里一行接一行连续摆放的顺序一致。行数列数 C 没有现成函数可问,自己用变量 rows、cols 记住;按行求和就是内层循环对每行各跑一遍,课件里三行的和分别是 9、22、21。遍历整张矩阵 O(m×n)。
开矩阵的机试惯用法
C 数组大小要在编译期定死,套路是:题目说 m,n ≤ 100,就在全局开 int g[105][105](留点余量),读入真实的 m、n 后只用前 m 行前 n 列,其余格子闲置不管。读入模板:scanf("%d %d", &m, &n); 然后双重 for 行优先 scanf("%d", &g[i][j]);——别忘了取地址符。全局数组自动清零,一开始就是全 0 的白纸;开在 main 里的局部数组则是垃圾值。
三个高频坑
① 行列写反:永远 g[行][列] = g[i][j],写成 g[j][i] 会越界或拿错值,是矩阵题最常见的 bug。② 大矩阵开在 main 里爆栈:局部变量放栈上,栈通常只有几 MB,int g[1000][1000] 直接崩溃;读入 m、n 后声明 g[m][n] 的变长数组同样开在栈上,一样爆,机试别赌。③ 局部数组不自动清零:计数、标记类矩阵要么开全局,要么写 = {{0}}。