顺时针打印矩阵

看到题目,这道题没有复杂的数据结构和高级算法;看起来似乎是个很简单的问题,但是其中有多层循环,已经大量的边界判定条件等。
思路:
这里写图片描述
如图:打印顺序是:上面一行—>右边一列 —–> 下面一行——>左边一列;知道图里的空白格都变成彩色;
我们用x,y 控制上面和左边的边界;end_rowend_col控制下面和右边的边界;
开始时:x=0; y=0; end_row=4;end_col=7;
打印一圈;
x++, y++; end_row–, end_col–
在打印一圈
….
x=end_row时:只剩最后1行;y=end_col时:只剩最后1列;
以上这是整体的循环逻辑;

现在,在整体循环逻辑下,我们要打印,上一行,右一列,下一行,左一列;用m,n控制当前行,列的每个元素,然后循环打印上下行,左右列;
m = x;
n = y;

第一步:
打印上面一行(当前行由x决定)

while(n != end_col)
    //打印array[x][n++];注意:当前所在行是由x决定的,所以行是x

第二步:
打印右一列(当前列由end_col决定)

while(m != end_row)
    //打印a[m++][end]

第三步:
打印下面一行(当前行由end_row决定)

while(n != y)
    //打印a[end_row][n--];因为是从右向左打印,在第一步结束后,n等于end_col

第四步:
打印左边一列(当前列由y决定)

while(m != x)
    //打印a[m--][y];因为是从下往上打印,第二步结束后,m等于end_col

以下是整体代码:

void Fun(vector<vector<int>> a)
{
    if (a.size() == 0)
        return;
    int row = a.size();
    int col = a[0].size();
    int x = 0;
    int y = 0;
    int end_row = row - 1;
    int end_col = col - 1;
    while (x <= end_row&&y <= end_col)
    {

        //只有一行(两种情况:矩阵本身只有一行 + 矩阵只会剩下一行需打印)
        if (x == end_row)
        {
            for (int i = y; i <= end_col; ++i)
                cout << a[x][i]<<" ";
        }
        //只有一列(两种情况: 矩阵本身只有一列 + 矩阵只剩下一列需打印)
        else if (y == end_col)
        {
            for (int i = x; i <= end_row;++i)
            cout << a[i][y] << " ";
        }
        else
        {
            int x1 = x;
            int y1 = y;
            //打印上面一行
            while (y1 != end_col)
                cout << a[x][y1++]<<" ";
            //打印右面一列
            while (x1 != end_row)
                cout << a[x1++][end_col] << " ";
            //在打印下面一行
            while (y1 != y)
                cout << a[end_row][y1--] << " ";
            //在打印左面一列
            while (x1 != x)
                cout << a[x1--][y] << " ";
        }
        x++;
        y++;
        end_row--;
        end_col--;
    }
}

int main()
{
    vector<vector<int>> v;
    vector<int> a1 = { 1, 2, 3, 4 };
    vector<int> a2 = { 10, 11, 12, 5 };
    vector<int> a3 = { 9, 8, 7, 6 };
    v.push_back(a1);
    v.push_back(a2);
    v.push_back(a3);
    Fun(v);
    system("pause");
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值