• 九度oj 题目1391:顺时针打印矩阵


    题目描述:

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

    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.

    输入:

    输入可能包含多个测试样例,对于每个测试案例,

    输入的第一行包括两个整数m和n(1<=m,n<=1000):表示矩阵的维数为m行n列。

    接下来的m行,每行包括n个整数,表示矩阵的元素,其中每个元素a的取值范围为(1<=a<=10000)。

    输出:

    对应每个测试案例,输出一行,

    按照从外向里以顺时针的顺序依次打印出每一个数字,每个数字后面都有一个空格。

    样例输入:
    4 4
    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 

    这个题一开始是用哨兵的思想做的,在矩阵周围都设为0,碰到哨兵就转一个方向,开始设的哨兵值是0,结果一直超时,题目明明说 a >= 1的
    只好设哨兵为-1了,代码如下
     1 #include <cstdio>
     2 #include <cstring>
     3  
     4 int matrix[1003][1003];
     5 int dir[][2] = {{0,1},{1,0},{0,-1},{-1,0}};
     6  
     7 int main(int argc, char const *argv[])
     8 {
     9     int m, n;
    10     while(scanf("%d %d",&m,&n) != EOF) {
    11         for(int i = 0; i < 1003; i++) {
    12             for(int j = 0; j < 1002; j++) {
    13                 matrix[i][j] = -1;
    14             }
    15         }
    16  
    17         for(int i = 1; i <= m; i++) {
    18             for(int j = 1; j <= n; j++) {
    19                 scanf("%d",&matrix[i][j]);
    20             }
    21         }
    22  
    23         int tx = 1, ty = 0;
    24         int di = 0;
    25         int num = m*n;
    26         int cnt = 0;
    27         while(cnt < num) {
    28             tx = tx + dir[di][0];
    29             ty = ty + dir[di][1];
    30             while(matrix[tx][ty] != -1) {
    31                 printf("%d ",matrix[tx][ty]);
    32                 matrix[tx][ty] = -1;
    33                 cnt++;
    34                 tx = tx + dir[di][0];
    35                 ty = ty + dir[di][1];
    36             }
    37             tx = tx - dir[di][0];
    38             ty = ty - dir[di][1];
    39             di = (di+1) % 4;
    40              
    41         }
    42         puts("");
    43     }   
    44     return 0;
    45 }

    但是代码居然跑了980ms,

    试着修改了一下,按四个方向判断输出

     1 #include <cstdio>
     2 #include <cstring>
     3  
     4 int matrix[1003][1003];
     5 int dir[][2] = {{0,1},{1,0},{0,-1},{-1,0}};
     6  
     7 int main(int argc, char const *argv[])
     8 {
     9     int m, n;
    10     while(scanf("%d %d",&m,&n) != EOF) {
    11         for(int i = 0; i < 1002; i++) {
    12             for(int j = 0; j < 1002; j++) {
    13                 matrix[i][j] = -1;
    14             }
    15         }
    16  
    17         for(int i = 1; i <= m; i++) {
    18             for(int j = 1; j <= n; j++) {
    19                 scanf("%d",&matrix[i][j]);
    20             }
    21         }
    22  
    23         int tx = 1, ty = 0;
    24         int di = 0;
    25         int num = m*n;
    26         int cnt = 0;
    27         while(cnt < num) {
    28             int i;
    29             for(i = ty+1; matrix[tx][i] != -1; i++) {
    30                 printf("%d ",matrix[tx][i]);
    31                 cnt++;
    32                 matrix[tx][i] = -1;
    33             }
    34             ty = i-1;
    35             for(i = tx+1; matrix[i][ty] != -1; i++) {
    36                 printf("%d ",matrix[i][ty]);
    37                 cnt++;
    38                 matrix[i][ty] = -1;
    39             }
    40             tx = i-1;
    41             for(i = ty-1; matrix[tx][i] != -1; i--) {
    42                 printf("%d ",matrix[tx][i]);
    43                 cnt++;
    44                 matrix[tx][i] = -1;
    45             }
    46             ty = i+1;
    47             for(i = tx-1; matrix[i][ty] != -1; i--) {
    48                 printf("%d ",matrix[i][ty]);
    49                 cnt++;
    50                 matrix[i][ty] = -1;
    51             }
    52             tx = i+1;
    53         }
    54         puts("");
    55     }   
    56     return 0;
    57 }

    跑了940ms

    考虑时间这么长,是不是赋值语句导致的,只好换了个思路,用普通的界限来判断输出了

     1 #include <cstdio>
     2 #include <cstring>
     3  
     4 int matrix[1003][1003];
     5  
     6 int main(int argc, char const *argv[])
     7 {
     8     int m, n;
     9     while(scanf("%d %d",&m,&n) != EOF) {
    10  
    11         for(int i = 1; i <= m; i++) {
    12             for(int j = 1; j <= n; j++) {
    13                 scanf("%d",&matrix[i][j]);
    14             }
    15         }
    16  
    17         int tx = 1, ty = 0;
    18         int num = m*n;
    19         int cnt = 0;
    20         int xt = m, yt = n, xf = 2, yf = 1;
    21         while(cnt < num) {
    22             int i;
    23             for(i = ty+1; i <= yt; i++) {
    24                 printf("%d ",matrix[tx][i]);
    25                 cnt++;
    26             }
    27             yt--;
    28             ty = i-1;
    29             if(cnt == num) {
    30                 break;
    31             }
    32             for(i = tx+1; i <= xt; i++) {
    33                 printf("%d ",matrix[i][ty]);
    34                 cnt++;
    35             }
    36             xt--;
    37             tx = i-1;
    38             if(cnt == num) {
    39                 break;
    40             }
    41             for(i = ty-1; i >= yf; i--) {
    42                 printf("%d ",matrix[tx][i]);
    43                 cnt++;
    44             }
    45             ty = i+1;
    46             yf++;
    47             if(cnt == num) {
    48                 break;
    49             }
    50  
    51             for(i = tx-1; i >= xf; i--) {
    52                 printf("%d ",matrix[i][ty]);
    53                 cnt++;
    54             }
    55             tx = i+1;
    56             xf++;
    57         }
    58         puts("");
    59     }   
    60     return 0;
    61 }

    时间果然变少,只花了500ms

  • 相关阅读:
    面向对象定义
    xml与面上对象初识
    模块configparser/subprocess/表格处理模块
    python模块
    python-判断语句
    python了解
    Qt Qwdget 汽车仪表知识点拆解7 图像绘制,旋转
    Qt Qwdget 汽车仪表知识点拆解6 自定义控件
    Qt Qwdget 汽车仪表知识点拆解5 标题栏图标闪烁
    Qt Qwdget 汽车仪表知识点拆解4 另类进度条实现
  • 原文地址:https://www.cnblogs.com/jasonJie/p/5820128.html
Copyright © 2020-2023  润新知