您的位置:首页 > Web前端

剑指offer:顺时针打印矩阵

2015-09-05 15:16 316 查看
题目描述

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.

[code]#include <stdio.h>
#include <iostream>
#include <vector>

using namespace std;

class Solution {
public:
    vector<int> printMatrix(vector<vector<int> > matrix) {      
        int columns = 0;
        int rows = 0;
        vector<int> vec;
        int i = 0, j = 0;
        int cycles = 0;

        /* 每一圈的左上坐标 */
        int left_up_x = 0, left_up_y = 0;

        /* 每一圈的右下坐标 */
        int right_down_x = 0, right_down_y = 0;

        /* 得到行数 */
        rows = matrix.size();

        /* 如果二维数组是空的,直接返回 */
        if(0 == rows)
        {
            return vec;
        }

        /* 得到列数 */
        columns = matrix[0].size();

        /* 得到顺时针的圈数 */
        cycles = (rows+1)/2;
        cycles = ((columns+1)/2) > cycles ? cycles:((columns+1)/2);

        for(i = 0; i < cycles; i++)
        {
            /* 得到边界条件 */
            left_up_x = i;
            left_up_y = i;
            right_down_x = columns - 1 - i;
            right_down_y = rows - 1 - i;

            /* 打印上面的一行 */
            for(j = i; j <= right_down_x; j++)
            {
                vec.push_back(matrix[i][j]);
            }

            /* 打印右边的一列 */
            if(right_down_y > left_up_y)
            {
                for(j = i+1; j <= right_down_y; j++)
                {
                    vec.push_back(matrix[j][right_down_x]);
                }
            }

            /* 打印下面的一行 */
            if(right_down_x > left_up_x && right_down_y > left_up_y)
            {
                for(j = right_down_x - 1; j >= left_up_x; j--)
                {
                    vec.push_back(matrix[right_down_y][j]);
                }
            }

            /* 打印左边的一列 */
            if(right_down_y-1 > left_up_y && right_down_x > left_up_x)
            {
                for(j = right_down_y-1; j >= left_up_y+1; j--)
                {
                    vec.push_back(matrix[j][left_up_x]);
                }
            }

        }       

        return vec;
    }
};

int main()
{

    vector<int> vec(4);
    vector<int> vec1(1);

    vector<int> vecReturn(16);
    Solution s;
    vector<vector<int> > v;
    vector<vector<int> > v1;
    vector<vector<int> > v2;
    int i = 0, j = 0;

    for(i = 0; i < 4; i++)
    {
        v.push_back(vec);
        v1.push_back(vec1);
    }

    for(i = 0; i < 4; i++)
    {
        for(j = 0; j < 4; j++)
        {
            v[i][j] = i*4+j +1;
        }
    }

    v1[0][0] = 1;
    v1[1][0] = 2;
    v1[2][0] = 3;
    v1[3][0] = 4;

    v2.push_back(vec);
    v2[0][0] = 1;
    v2[0][1] = 2;
    v2[0][2] = 3;
    v2[0][3] = 4;
    vecReturn = s.printMatrix(v2);

    for(i = 0; i < 16; i++)
    {
        cout << vecReturn[i] << " ";
    }
    cout << endl;

    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: