返回顶部

收藏

顺时针打印矩阵

更多

题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如:如果输入如下矩阵:1 2 3 45 6 7 89 10 11 1213 14 15 16则依次打印出数字1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10。http://zhedahh t.blog.163.com/blog/static/254111742010111112236313/上文中给出了一种方法,但比较麻烦。我给出的算法如下: 遍历即可,遍历的方向为右、下、左、上、右……方向用dir表示,dir=(dir+1)%4即可表示方向变化。不同方向时,前进递增的值放在b[][]中,b[0] [1]和b[0][2]分别表示方向为0时,遍历时x和y的递增值。d数组表示前进时的“墙”,一共有up、right、down、left四堵墙,遍历过程中,墙的 位置不断变化,如向右遍历到尽头时,上面的墙up要递增1,向下遍历到尽头时,right墙要递减1,依此类推……

[C/C++]代码

#include <iostream>

using namespace std;

int main() {

    int b[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
    int r,c,i,j;
    int d[4];

    while (cin>>r>>c)
    {
        int **a = new int*[r];
        for (i=0; i<r; i++) {
            a[i] = new int[c];
        }

        for (i=0; i<r; i++)
        for (j=0; j<c; j++){
            cin>>a[i][j];
        }

        int dir =0;
        int tempi, tempj;
        d[0] = 0;//up
        d[1] =c; //right
        d[2] = r;//down
        d[3] =0;//left
        i=0;
        j=0;
        cout<<a[0][0]<<endl;

        while (1) {
         tempi = i+b[dir][0];
         tempj = j+b[dir][1];
        if (tempi>=d[0]&&tempi<d[2]&&tempj>=d[3]&&tempj<d[1]){
            i = tempi;
            j = tempj;
            cout<<a[i][j]<<endl;
        }
        else{
            if (dir%3 == 0){

                d[dir]++;

                if (d[dir] == d[(dir+2)%4])

                    break;

            }

            else{
                d[dir]--;
                if (d[dir] == d[(dir+2)%4])
                    break;
            }
            dir = (dir+1)%4;
        }

        }

        for (i=0; i<r; i++) {
            delete []a[i];
            a[i] = NULL;
        }

        delete []a;
        a = NULL;
    }

    return 0;
}

标签:矩阵

收藏

0人收藏

支持

0

反对

0

发表评论