数组与矩阵问题

1. 转圈打印矩阵

2. 将正方形矩阵顺时针旋转90度

3. "之"字形打印矩阵

4. 找到无序数组中最小的k个数

 

1. 题目:给定一个整型矩阵,请按照转圈方式打印它。
例如:

        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

解法

void printMatrixCircle(vector<vector<int>>map)
{
    int n = map.size(), m = map[0].size();
    int c = 0;
    int i = 0, j=0;
    while (c <= n / 2) {
        for (j = c; j < m - c; j++) {
            cout << map[i][j]<<" ";
        }
        j--;
        for (i = c+1; i < n-c; i++) {
            cout << map[i][j]<<" ";
        }
        i--;
        for (j = j - 1; j >= c; j--){
            cout << map[i][j]<<" ";
        }
        j++;
        for (i = i - 1; i >= c+1; i--){
            cout << map[i][j]<<" ";
        }
        i++;
        c++;
    }
}

2. 题目:给定一个M*N的矩阵matrix,把这个矩阵调整成顺时针转动90度后的形式。
例如:                         顺时针转动90度为:
1     2    3    4               13    9    5    1
5     6    7    8               14   10   6    2
9    10  11  12              15   11   7    3
13  14  15  16              16   12   8    4
解法:

void rotateEdge(vector<vector<int>>&map,int i,int j,int n,int m)
{
    int times = m - j;
    int tmp = 0;
    for (int c = 0; c != times; c++) {
        tmp = map[i][j + c];
        map[i][j + c] = map[n-c][j];
        map[n - c][j] = map[n][m-c];
        map[n][m-c] = map[i+c][m];
        map[i + c][m] = tmp;
    }
}
void rotationMatrix(vector<vector<int>>&map) {
    int n = map.size()-1, m = map[0].size()-1;
    int i = 0, j = 0;
    while (i < n) {
        rotateEdge(map,i++,j++,n--,m--);
    }
}

3. 题目:给定一个矩阵matrix,按照之字形的方式打印这个矩阵,例如
    1   2    3    4
    5   6    7    8
    9  10  11  12
之字形打印的结果为:1,2,5,9,6,3,4,7,10,11,8,12
解法

void printLevel(vector<vector<int>>map, int i, int j, int x, int y, bool f)
{
    if (f) {
        while (i != x + 1)
            cout << map[i++][j--] << " ";
    }
    else {
        while (x != i - 1)
            cout << map[x--][y++] << " ";
    }
}
void printMatrixZigZag(vector<vector<int>>map)
{
    int i = 0, j = 0, x = 0, y = 0;
    int n = map.size() - 1, m = map[0].size() - 1;
    bool fromUp = false;
    while (i != n + 1) {
        printLevel(map,i,j,x,y,fromUp);
        i = j == m ? i + 1 : i;
        j = j == m ? j : j + 1;
        y = x == n ? y + 1 : y;
        x = x == n ? x : x + 1;
        fromUp = !fromUp;
    }
    cout << endl;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值