最近刷题刷到一个以前做过的题: 矩阵螺旋输出.
当时认为自己刚学c不久就没做那个题(主要是当时试了几次没有成功), 然后今天在学习c++的时候又遇到这个题了, 这当然不能放过了。
我记得上次遇到这题是直接去复制了别人的代码提交的, 但是那份代码很长, 要把矩阵的行列分不同的情况, 我觉得非常的麻烦, 经过一番尝试, 发现用4个变量分别代表数组的上下左右的边界(南北东西), 然后在用一个p(px, py)来遍历整个数组是可以成功的。下面是代码和我自己画的草图 , 一个行6列9的矩阵。结合代码一起看应该会清晰一些。
#include <iostream>
using namespace std;
#define N 100
void func(int matrix[][N], int m, int n) {
/* 先定义边界 pN North, pS South, pW West, pE East */
int pN = 0, pS = m - 1, pW = 0, pE = n - 1;
int px = -1, py = 0; // px 如果赋初值为0后面要多写一行, 所以我图方便就...
int tmp[N * N] = { 0 }; // 其实不用定义数组, 遍历的时候直接输出, 但是oj上提交大部分是有格式要求的, 定义个数组来存放遍历的矩阵的值
int k = 0;
while (1) {
/* 遍历 py 行 */
while (++px <= pE) {
tmp[k++] = matrix[py][px];
}
pN += 1; // 因为上边界已经遍历完了, 所以上边界向下移一行
px -= 1; // 前面 ++px 在最后一次循环的时候又加了一次, 超出了矩阵的范围
if (pN > pS) break; // 如果上边界大于下边界就已经遍历完
// 后面几个循环同理.
/* 遍历 px 列 */
while (++py <= pS) {
tmp[k++] = matrix[py][px];
}
pE -= 1;
py -= 1;
if (pE < pW) break;
while (--px >= pW) {
tmp[k++] = matrix[py][px];
}
pS -= 1;
px += 1;
if (pS < pN) break;
while (--py >= pN) {
tmp[k++] = matrix[py][px];
}
pW += 1;
py += 1;
if (pW > pE) break;
}
/* 最后这里就把遍历的值全部打印出来 */
for (int i = 0; i < k; ++i) {
i == 0 || cout << " ";
cout << tmp[i];
}
}
void init(int m, int n) {
int matrix[N][N];
/* 给矩阵输入数据 */
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
cin >> matrix[i][j];
}
}
func(matrix, m, n);
}
int main() {
int m, n;
cin >> m >> n;
init(m, n);
return 0;
}
第一次写博文, 不知道怎么表达, 不会作图直接就在本子上画了一个, 字也写的丑, 代码也只是通过了oj上的测试样例, 因为太高兴所以来写了我第一次的博文.
如果大佬们发现了什么不足还希望能指出来, 不管是写代码方面还是写博文我都会改正.
最后。。。写的不好别喷我啊(T_T).