矩阵螺旋输出c/c++

最近刷题刷到一个以前做过的题: 矩阵螺旋输出.
当时认为自己刚学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).

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值