首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

请教怎么顺时针打印矩阵

2012-04-30 
请问如何顺时针打印矩阵?题目是:给定一个矩阵,按照从外向里以顺时针的顺序依次打印每一个数组。也就说打印

请问如何顺时针打印矩阵?
题目是:
给定一个矩阵,按照从外向里以顺时针的顺序依次打印每一个数组。
也就说打印顺序为:
----------------------------->
| ------------------------> |
| | | |
| <-----------------------| |
| |
 <---------------------------
例如矩阵:
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

-----------------------------------------------
谢谢!

[解决办法]
就判断前面(可能向右,向左,向下,向上)一个位置是否已经取过,或者已经到边界,如果是,则改变方向取顺时针方90度方向的位置,否则直接取数据。一直到数据取完为止。假设当前点位置是(x1,y1),向前的位置是(x2,y2),则改变方向后的下个点的位置为(y2-y1+x1,x1+y1-x2).
[解决办法]
对m行n列矩阵,下个点的位置增量可能为(1,0),(0,1),(-1,0),(0,-1),每次选取方向改变了,也就是位置增量变成下一个了,依次循环。取出的数据,在第n,n+m-1,2*n+m-2,2*n+2*m-4这4个位置的地方,选取方向要改变。每4次方向改变,m和n各减2,继续取数据。直到m和n为0或-1,或者全部数据都取完。
[解决办法]
这样:

C/C++ code
#include <stdio.h>// 顺时针打印void clock_print(int arr[][4], int row_max, int col_max){    int i;    int r;         // 当前处理行    int c;         // 当前处理列    int top;       // 旋转后的厚度:顶    int bottom;    // 旋转后的厚度:底    int left;      // 旋转后的厚度:左边界    int right;     // 旋转后的厚度:右边界    int dir;       // 方向:0 1 2 3 -> 右 下 左 上(顺时针)    dir    = 0;    top    = 0;    bottom = 0;    left   = 0;    right  = 0;    c      = 0;    r      = 0;    i      = row_max * col_max;    printf("%d ", arr[r][c]);    while (true)    {        // 若所有元素处理完毕,就结束循环        if (i < 2)            break;        switch(dir)        {        case 0:  // 右行            if (c >= (col_max - right - 1))            {                dir = (dir + 1) % 4;                ++top;                continue;            }            ++c;            break;        case 1:  // 下行            if (r >= (row_max - bottom - 1))            {                dir = (dir + 1) % 4;                ++right;                continue;            }            ++r;            break;        case 2:  // 左行            if (c <= left)            {                dir = (dir + 1) % 4;                ++bottom;                continue;            }            --c;            break;        case 3:  // 上行            if (r <= top)            {                dir = (dir + 1) % 4;                ++left;                continue;            }            --r;            break;        }; // end switch        --i;        printf("%d ", arr[r][c]);    } // end while}void main(void){    int arr[4][4] = {        {1,2,3,4},        {5,6,7,8},        {9,10,11,12},        {13,14,15,16}    };    clock_print(arr, 4, 4);}
[解决办法]
要几阶就几阶嘛,把 4 改 50 呗,我这个是全球通用的, 不分奇偶阶:
C/C++ code
void clock_print(int arr[][50], int row_max, int col_max)...void main(void){     int arr[99999][50] = {……};     clock_print(arr, 99999, 50); } 

热点排行