【本文链接】

http://www.cnblogs.com/hellogiser/p/print-matrix-in-clockwise-direction.html

题目】

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。

例如:如果输入如下矩阵:

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。

分析

解决这道题的难度在于代码中会包含很多个循环,而且还有多个边界条件需要判断。如果在把问题考虑得很清楚之前就开始写代码,不可避免地会越写越混乱。因此解决这个问题的关键,在于先要形成清晰的思路,并把复杂的问题分解成若干个简单的问题。

通常当我们遇到一个复杂的问题的时候,我们可以用图形帮助我们思考。由于我们是以从外圈到内圈的顺序依次打印,我们在矩阵中标注一圈作为我们分析的目标。在下图中,我们设矩阵的宽度为columns,而其高度为rows。我们我们选取左上角坐标为(startX, startY),右下角坐标为(endX, endY)的一个圈来分析。

由于endX和endY可以根据startX、startY以及columns、rows来求得,因此此时我们只需要引入startX和startY两个变量。我们可以想象有一个循环,在每一次循环里我们从(startX, startY)出发按照顺时针打印数字。

【代码】

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
 
// 51_PrintMatrixInClockwiseDirection.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

// print number
void PrintNumber(int number)
{
    printf("%d ", number);
}

// print matrix normally
void PrintMatrix(int **a, int columns, int rows)
{
    ; i < rows; i++)
    {
        ; j < columns; j++)
        {
            printf("%d\t", a[i][j]);
        }
        printf("\n");
    }
}

/*
  sx,sy--------------ex,sy
    |                             |
    |                             |
    |                             |
  sx,ey--------------ex,ey
*/
// print numbers in 4 directions
void PrintNumbersInCircle(int **a, int columns, int rows, int sx, int sy)
{
    // a[y][x]
 - sx;
     - sy;
    int i;

// case1
    // sx,sy---ex,sy
    // a[sy][i]
    bool b1 = sx <= ex;
    bool b2 = sy < ey;
    bool b3 = sx < ex;
    ;
    if(b1)
    {
        // case1 matches b1
        for (i = sx; i <= ex; ++i)
        {
            int number = a[sy][i];
            PrintNumber(number);
        }
    }

//case2
    // ex,sy+1---ex,ey
    // a[i][ex]
    if(b1 && b2)
    {
        // case2 matches b1,b2
; i <= ey; ++i)
        {
            int number = a[i][ex];
            PrintNumber(number);
        }
    }

//case3
    // ex-1,ey---sx,ey
    // a[ey][i]
    if(b1 && b2 && b3)
    {
        // case3 matches b1,b2,b3
; i >= sx; --i)
        {
            int number = a[ey][i];
            PrintNumber(number);
        }
    }

//case4
    // sx,ey-1---sx,sy+1
    // a[i][sx]
    if(b1 && b2 && b3 && b4)
    {
        // case4 mathces b1,b2,b3,b4
; --i)
        {
            int number = a[i][sx];
            PrintNumber(number);
        }
    }
}

/*
print matrix in clockwise direction
by hellogiser 2014/5/23
*/
void PrintMatrixInClockwiseDirection(int **a, int columns, int rows)
{
    )
        return;
    ;
    ;
     * starty < rows)
    {
        PrintNumbersInCircle(a, columns, rows, startx, starty);
        startx++;
        starty++;
    }
}

void test_base(int **a, int columns, int rows)
{
    PrintMatrix(a, columns, rows);
    PrintMatrixInClockwiseDirection(a, columns, rows);
    printf("\n");
}

void test_case()
{
    ;
    ;
    int a[ROWS][COLUMNS];
    ; i < ROWS; i++)
        ; j < COLUMNS; j++)
            a[i][j] = i * COLUMNS + j + ;

int *p[ROWS];
    ; i < ROWS; i++)
        p[i] = a[i];

int **array = p;

test_base(array, COLUMNS, ROWS);
}

void test_main()
{
    test_case();
}

int _tmain(int argc, _TCHAR *argv[])
{
    test_main();
    ;
}
/*
//case1
[3*5]
1       2       3       4       5
6       7       8       9       10
11      12      13      14      15
1 2 3 4 5 10 15 14 13 12 11 6 7 8 9

//case2
[5*3]
1       2       3
4       5       6
7       8       9
10      11      12
13      14      15
1 2 3 6 9 12 15 14 13 10 7 4 5 8 11

//case3
[4*5]
1       2       3       4       5
6       7       8       9       10
11      12      13      14      15
16      17      18      19      20
1 2 3 4 5 10 15 20 19 18 17 16 11 6 7 8 9 14 13 12

//case4
[5*4]
1       2       3       4
5       6       7       8
9       10      11      12
13      14      15      16
17      18      19      20
1 2 3 4 8 12 16 20 19 18 17 13 9 5 6 7 11 15 14 10
*/

【参考】

http://zhedahht.blog.163.com/blog/static/254111742010111112236313/

http://www.cnblogs.com/python27/archive/2011/11/29/2267975.html

【本文链接】

http://www.cnblogs.com/hellogiser/p/print-matrix-in-clockwise-direction.html

51. 顺时针打印矩阵[print matrix in clockwise direction]的更多相关文章

  1. 剑指offer十九之顺时针打印矩阵

    一.题目 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2, ...

  2. 《剑指offer》— JavaScript(19)顺时针打印矩阵

    顺时针打印矩阵 题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打 ...

  3. 《剑指offer》顺时针打印矩阵

    本题来自<剑指offer> 顺时针打印矩阵 题目: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 1 ...

  4. 【剑指offer】面试题 29. 顺时针打印矩阵

    面试题 29. 顺时针打印矩阵 题目描述 题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...

  5. 剑指Offer(十九):顺时针打印矩阵

    剑指Offer(十九):顺时针打印矩阵 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/baid ...

  6. 剑指Offer_Java_顺时针打印矩阵(二维数组)

    顺(逆)时针打印矩阵 算法思想: 简单来说,就是不断地收缩矩阵的边界 定义四个变量代表范围,up(初始0).down(初始-行高).left(初始-0).right(初始-列宽), 向右走存入整行的值 ...

  7. 剑指offer---1、顺时针打印矩阵

    剑指offer---1.顺时针打印矩阵 一.总结 一句话总结: 谋而后动+多做:还是要谋而后动,但是怎么谋而后动,很有学问,做好的方式就是多做 问题就这些问题:解决了就好了,比如php多维数组 面试的 ...

  8. 剑指 Offer 29. 顺时针打印矩阵 + 蛇形矩阵 + 模拟 + 思维题

    剑指 Offer 29. 顺时针打印矩阵 Offer_29 题目描述: 题解分析: 题目的初衷是将这道题当做一个简单题处理 这道题一开始想的太复杂了,其实可以参考迷宫广度优先搜索的过程,只不过在选定一 ...

  9. 剑指 Offer 29. 顺时针打印矩阵

    剑指 Offer 29. 顺时针打印矩阵 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. 示例 1: 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出: ...

随机推荐

  1. 高介分类:核方法与支持向量机(SVM)

        数据模型:并不是简单地二维数据,多个维度或者对象的数据聚合起来      {           persion1's attr1:value1,...,persion1's attrN:va ...

  2. sqlite3的图片的(二进制数据)存取操作

    sqlite3的图片的(二进制数据)存取操作   前言 上篇介绍了sqlite3的一些常用插入操作方法和注意事项,在实际项目中遇到了图片缓存的问题,由于服务器不是很稳定,且受到外界环境的干扰(例如断电 ...

  3. Linux哲学思想--基本法则

    1.一切皆文件: 2.单一目的的小程序: 3.组合小程序完成复杂任务: 4.文本文件保存配置信息: 5.尽量避免捕获用户接口: 6.提供机制,而非策略. 自从Linux一诞生就注定了其成为经典的命运. ...

  4. MVC5知识点记录

    IIS/ASP.NET管道 原理永远是重中之重,所以在开篇的地方,先了解一下地址栏输入网址回车之后的故事. 不同IIS版本处理请求也不一样 IIS5 IIS 5.x 运行在进程InetInfo.exe ...

  5. 定位框一闪而过 iOS Swift

    需求:获取经纬度. 方案:我自定义了一个类模块CLLocationModule.swift 备注以下代码里 let IS_IOS8 = (UIDevice.currentDevice().system ...

  6. iOS - 消息转发处理

    详细运行时基础 NSInvocation介绍 NSHipster-Swizzling Objective-C Method相关方法分析 Type Encodings Objc是OOP,所以有多态. 当 ...

  7. vm.max_map_count

    Virtual memoryedit Elasticsearch uses a hybrid mmapfs / niofs directory by default to store its indi ...

  8. confirm对话框取消后阻止ajax操作、ajax做批量删除

    在做批量删除的时候,需要用confirm弹出一个提示框让用户确认是否删除,点击确定,执行操作,点击取消,取消操作.但是如果使用ajax把选中项的主键值传到处理页面处理时,如果使用下面的方法将confi ...

  9. iOS 10、Xcode 8 遇到部分问题解决记录

    今天把iphone 6 升级到ios10 后,用Xcode 7进行真机调试的时候提示: Could not find Developer Disk Image 果断准备升级到Xcode 8 .但是想保 ...

  10. 使用powershell批量添加Qt的文件(生成pro)

    想使用QtCreator作为编辑器编辑keil或者IAR的工程,需要生成.pro文件,于是使用powershell批量处理. 源码如下: $incPath = dir -filter "*. ...