之字形遍历数组

来源:互联网 发布:目前淘宝卖什么最火 编辑:程序博客网 时间:2024/09/21 06:33

之字形遍历数组
题目要求:给丁一峰大小为m*n的矩阵,要求之字形遍历该矩阵,例如:
[[1,2,3,4],
[5,6,7,8],
[9,10,11,12]]
应该输出[1,2,5,9,6,3,4,7,10,11,8,12];

解题思路:
给定一个矩阵,我们从第一个元素进行遍历知道最后一个元素,遍历方式无非是以下四种,
step:1
向右移动(这种移动方式只会出现在row==0 || row == mat_rows-1;)
step2:
向右移动之后只会出现两种移动方式:
(1)向左下移动(row++,col–),左下移动之后,又有三种种移动方式,向下移动(col == 0);继续左下移动(col != 0);向右移动(row = mat_rows-1)
(2)向右上移动(row–,col++),右上移动之后,又有两种移动方式,向下移动(col == mat_cols-1),继续向右上移动;向右移动(row==0)
这样我们就遍历了所有的移动方式.
下面我们直接贴代码:

vector<int> zigzagScan(vector<vector<int>> &matrix){    vector<int> result;    //当矩阵中的元素为空或者只有一个元素的时候的异常处理    if (matrix.size() == 1 || matrix[0].size() == 0)    {        return matrix[0];    }    //当矩阵中的元素只有一列的时候,直接返回所有元素    if (matrix[0].size() == 1)    {        for (size_t i = 0; i < matrix.size(); i++)        {            result.push_back(matrix[i][0]);        }        return result;    }    //定义矩阵的行数    int mat_rows = matrix.size();    //定义矩阵的列数    int mat_cols = matrix[0].size();    int row = 0, col = 0;    //第一行的第一个元素是向右移的    Move move = moveToRight;    //row = n-1&&col = n-1的情况在while循环结束后处理,防止出现越界的情况    while (row != mat_rows - 1 || col != mat_cols - 1)    {        //将每个元素依次压入到数组中去        cout << matrix[row][col] << ' ';        result.push_back(matrix[row][col]);        switch (move)        {        case moveToRight:            col++;            if (row == 0)                move = moveToBottomLeft;            else                move = moveToTopRight;            break;        case moveToTopRight:            row--;            col++;            if (row == 0 && col != mat_cols - 1)                move = moveToRight;            else if (col == mat_cols - 1)                move = moveToBottom;            else                move = moveToTopRight;            break;        case moveToBottom:            row++;            if (col == 0)                move = moveToTopRight;            else                move = moveToBottomLeft;            break;        case moveToBottomLeft:            row++;            col--;            if (col == 0 && row != mat_rows - 1)                move = moveToBottom;            else if (row == mat_rows - 1)                move = moveToRight;            else                move = moveToBottomLeft;            break;        }    }    cout << matrix[mat_rows - 1][mat_cols-1] << ' ';    result.push_back(matrix[mat_rows - 1][mat_cols - 1]);    return result;}
0 0