矩阵波浪形打印结果不符如何修正?含反向波浪实现逻辑
矩阵波浪形打印问题修正与逻辑解析
我需要将矩阵按波浪形打印为7 4 1 2 5 8 9 6 3,但当前的C语言代码输出结果是1 4 7 2 5 8 3 6 9。以下是问题详情、错误代码,以及修正方案和波浪打印逻辑说明:

当前错误代码
#include<stdio.h> int main() { int m; printf("enter no. of rows of 1st matrix:"); scanf("%d", &m); int n; printf("enter no. of columns of 1st matrix:"); scanf("%d", &n); int a[m][n]; printf("\n enter the elements of 1st matrix"); for(int i = 0; i < m; i++) { for(int j = 0; j < n; j++) { scanf("%d", &a[i][j]); } } // wave print for(int j = 0; j < n; j++) { if(n % 2 == 0) { for(int i = 0; i < m-1; i++){ printf("%d ", a[i][j]); } } else { for(int i = 0 - 1; i<=n-1; i++) { printf("%d ", a[i][j]); } } printf("\n"); } return 0; }
一、代码修正
原代码存在两处核心错误:
- 错误用总列数的奇偶性判断遍历方向,实际应根据当前列的索引奇偶性决定;
- 反向遍历的循环逻辑完全混乱,出现非法负索引,且循环条件错误使用列数而非行数。
修正后的代码如下:
#include<stdio.h> int main() { int m; printf("输入矩阵行数:"); scanf("%d", &m); int n; printf("输入矩阵列数:"); scanf("%d", &n); int a[m][n]; printf("\n输入矩阵元素:"); for(int i = 0; i < m; i++) { for(int j = 0; j < n; j++) { scanf("%d", &a[i][j]); } } // 波浪形打印 for(int j = 0; j < n; j++) { // 偶数列(从0开始计数):从下往上遍历行 if(j % 2 == 0) { for(int i = m - 1; i >= 0; i--) { printf("%d ", a[i][j]); } } // 奇数列:从上往下遍历行 else { for(int i = 0; i < m; i++) { printf("%d ", a[i][j]); } } } printf("\n"); return 0; }
针对示例中的3×3矩阵,按行输入1 2 3 4 5 6 7 8 9后,运行会输出7 4 1 2 5 8 9 6 3,完全符合预期。
二、正向/反向波浪打印逻辑
1. 正向波浪(示例需求的打印方式)
核心逻辑是按列遍历矩阵,根据列索引奇偶性切换行的遍历方向:
- 偶数索引列(第0、2、4...列):从最后一行(行索引
m-1)向上遍历至第0行; - 奇数索引列(第1、3、5...列):从第0行向下遍历至最后一行;
- 所有列的遍历结果连续输出,形成波浪形效果。
2. 反向波浪(与示例相反的打印方式)
若需要反向波浪,只需调换奇偶列的遍历方向:
- 偶数索引列:从上到下遍历行;
- 奇数索引列:从下到上遍历行;
- 最终会得到类似
1 4 7 8 5 2 3 6 9的输出。
内容的提问来源于stack exchange,提问作者Samarth Talreja
相关产品推荐
相关产品推荐

