打印蛇形矩阵

题目描述:编写一个函数,参数为一个整数N,返回一个N*N二维矩阵,这个矩阵的特点是左上角值为1,顺时针旋转缠绕从1到N*N。
例如:输入一个整数5
输出:
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
做法:
定义一个for循环,每次开始都向里走一层,开始节点是i,j,那结束条件为 i < N - i && j < N - j,每次循环i+1,j+1。
循环内部有四个if条件,if条件低下有一个while循环,依次填充矩阵元素。
第一个if语句,判断能不能向右走,那么判断条件就为指向最后一个元素的下一个下标 减去 指向最前边元素的下标,判断前后之中右没有元素,若有,即 大于零,则开始循环不断向右走来填充矩阵元素。当下标指向了最后一个元素的下一个下标,则表示走到头了,这时候跳出循环。需要注意,跳出循环后,当前下标的列要后退一格,行要向下走一格,以为右上角已经有值了。
第二个if语句判断能不能向下走,需要判断当前列指向最后一个元素的下一个元素 - 指向第一个元素中间是否还有元素,若有,while循环开始往下走。跳出循环,需要向上退一格,向左走一格。
第三个if语句,要判断能不能向左走,这里需要注意,若能走下边,则说明行和列都有元素。并且需要注意:这里判断语句要有等于好,因为可以走到未走过的元素的最顶头。
第四个if语句,是要判断能不能往上走,往上走的条件是行列都能走,也就是行列都有元素。但这里不能走到顶头,因为顶头已将在向右走的时候赋过值了。
代码如下:

# include <iostream>
# include <vector>

using namespace std;

vector<vector<int> > getSnakeMatrix(int N)
{
    vector<vector<int> > matrix(N, vector<int>(N));
    if (N <= 0)
        return matrix;
    int cnt = 0;
    for (int i = 0, j = 0; i < N - i && j < N - i; ++i, ++j)
    {
        int m = i, n = j;
        if ( N - j - j > 0 )
        {
            while ( n < N - j)
            {
                matrix[m][n++] = ++cnt;
            }
        }
        n--;
        m++;
        if ( N - i - i > 0)
        {
            while ( m < N - i)
            {
                matrix[m++][n] = ++cnt;
            }
        }
        m --;
        n --;
        if ( N - j - j > 0 && N - i - i > 0)
        {
            while (  n >= j)
            {
                    matrix[m][n--] = ++cnt;
            }
        }
        n ++;
        m --;
        if (N - i - i > 0 && N - j - j > 0)
        {
            while (  m > i)
            {
                matrix[m--][n] = ++cnt;
            }
        }
    }
    return matrix;
}
void printMatrix(vector<vector<int> > &matrix)
{
    for (unsigned int i = 0; i < matrix.size(); ++i)
    {
        for (unsigned int j = 0; j < matrix[i].size(); ++j)
        {
            cout << matrix[i][j] << '\t';
        }
        cout << endl;
    }
}
int main(void)
{
    vector<vector<int> > matrix;
    int N;
    cout << "please input N: ";
    cin >> N;
    matrix = getSnakeMatrix(N);
    printMatrix(matrix);
    return 0;
}

若有错误之处,敬请指正。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值