顺时针打印矩阵

通常当我们遇到一个复杂的问题的时候,我们可以用图形帮助我们思考。由于我们是以从外圈到内圈的顺序依次打印,我们在矩阵中标注一圈作为我们分析的目标。在下图中,我们设矩阵的宽度为columns,而其高度为rows。我们我们选取左上角坐标为(startX, startY)。我们可以想象有一个循环,在每一次循环里我们从(startX, startY)出发按照顺时针打印数字。

接着我们分析这个循环结束的条件。对一个5×5的矩阵而言,最后一圈只有一个数字,对应的坐标为(2, 2)。我们发现5 > 2 * 2。对一个6×6的矩阵而言,最后一圈有四个数字,对应的坐标仍然为(2, 2)。我们发现6 > 2 * 2依然成立。于是我们可以得出,让循环继续的条件是columns > startX * 2 && rows > startY * 2。有了这些分析,我们就可以写出如下的代码:

#include <iostream>

using namespace std;

void Print(int num[][4], int rows, int cols, int start)
{
    int i;
    //shang
    for(i=start; i<cols-start; i++)
        cout<<num[start][i]<<endl;
    //you
    for(i=start+1; i<rows-start; i++)
        cout<<num[i][cols - start-1]<<endl;
    //xia
    for(i=cols-start-2; i>=start; i--)
        cout<<num[rows-start-1][i]<<endl;
    //zuo
    for(i=rows-start-2; i>start; i--)
        cout<<num[i][start]<<endl;
}

void PrintMatrix(int num[][4], int rows, int cols)
{
    if(num==NULL || rows<=0 || cols<=0)
        return;

    int start = 0;
    while(rows > start*2 && cols > start*2)
    {
        Print(num, rows, cols, start);
        start++;
    }
}

int main()
{
    int in[][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
    PrintMatrix(in, 4, 4);
    return 0;
}
顺时针打印二维数组是指按照螺旋顺序从外到内遍历并输出一个矩阵的所有元素。具体步骤可以分为以下几个部分: 1. **确定边界**:设定初始上下左右四个方向的边界值,分别为`top`, `bottom`, `left`, 和 `right`。 2. **按层依次访问**: - 先沿着上边界的行从左向右读取数据,并将该行纳入结果集;然后缩小顶部边界范围(`top++`); - 接着沿右侧列由上往下读入数值至集合里,再更新右边框位置信息(`right--`); - 如果未超出界限,则继续处理底部的一排数字以及左侧一栏的数据(分别对应向下至上、自右往左),同时调整相应底端与左段索引。 3. **循环迭代直至完成全部扫描**:每次移除一层后检查剩余区域是否还有待处理内容(即判断当前四条边界之间是否存在有效交集),若有则重复上述过程直到整个数组被完整地解析完毕为止。 以下是Python示例代码片段用于演示这一操作: ```python def spiralOrder(matrix): if not matrix or not matrix[0]: return [] rows, cols = len(matrix), len(matrix[0]) top, bottom, left, right = 0, rows-1, 0, cols-1 result = [] while True: # 左到右 for i in range(left, right+1): result.append(matrix[top][i]) top += 1 if top > bottom: break # 上到下 for i in range(top, bottom+1): result.append(matrix[i][right]) right -= 1 if left > right: break # 右到左 for i in range(right, left-1,-1): result.append(matrix[bottom][i]) bottom -= 1 if top > bottom: break # 下到上 for i in range(bottom,top-1,-1): result.append(matrix[i][left]) left += 1 if left > right: break return result ``` 通过此函数即可实现对任意大小非空矩形阵列元素做旋转式的提取排列工作啦!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值