【本文链接】

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. 多线程异步导出excel

    先新建一个执行类 @Service public class MultiService { private static final Logger logger = LoggerFactory.get ...

  2. 多线程之异步编程: 经典和最新的异步编程模型, IAsyncInfo 与 Task 相互转换

    经典的异步编程模型(IAsyncResult) 最新的异步编程模型(async 和 await) 将 IAsyncInfo 转换成 Task 将 Task 转换成 IAsyncInfo 示例1.使用经 ...

  3. Oracle的一些操作

    . 创建用户 Create user 用户名 identified by "密码"; 例如:create user ghc_ez identified by "ghc_2 ...

  4. css 文字超出部分显示省略号(原)

    单行超出省略号 #word1{width: 100px; text-overflow: ellipsis; overflow: hidden;} 几行超出省略号(只兼容webkit内核) #wordN ...

  5. MySQL隐式转化整理

    MySQL隐式转化整理 前几天在微博上看到一篇文章:价值百万的 MySQL 的隐式类型转换感觉写的很不错,再加上自己之前也对MySQL的隐式转化这边并不是很清楚,所以就顺势整理了一下.希望对大家有所帮 ...

  6. 如何用phantomjs去抓取js渲染后的页面

    1.安装phantomjs 网上有很多. 2.执行官网上的示例代码 // Read the Phantom webpage '#intro' element text using jQuery and ...

  7. C语言变量类型和具体的范围

    什么是变量?变量自然和常量是相对的.常量就是 1.2.3.4.5.10.6......等固定的数字,而变量则根我们小学学的 x 是一个概念,我们可以让它是 1,也可以让它是 2,我们想让它是几是我们的 ...

  8. js事件流

    event:事件对象,当一个事件发生的时候,和当前这个对象发生的这个事件有关的一些详细的信息都会被临时保存在一个指定地方-event对象,供我们在需要调用.event对象必须是在一个事件调用的函数里 ...

  9. Java虚拟机浅探

    简介 对于java开发人员了来说,对java虚拟机肯定有着或多或少的了解.因为有了虚拟机的存在,才会使得java的内存管理变得那么方便,不再像C++那样使用new/delete来直接管理内存.知名的j ...

  10. Linux下数据恢复软件extundelete

    extundelete软件专门解决意外删除事件的,有时候不小心 rm -rf * 就可能毁掉有用的数据.因此就出现了这个恢复工具,但这个工具也不是万能的,删除数据后一定要停止所以的写操作.以免Inod ...