题目描述:

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

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)。

输出:

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

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

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

但是代码居然跑了980ms,

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

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

跑了940ms

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

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

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

九度oj 题目1391:顺时针打印矩阵的更多相关文章

  1. 剑指Offer - 九度1391 - 顺时针打印矩阵

    剑指Offer - 九度1391 - 顺时针打印矩阵2013-11-24 04:55 题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 ...

  2. 九度OJ 题目1384:二维数组中的查找

    /********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...

  3. hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人

    钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  4. 九度oj题目&amp;吉大考研11年机试题全解

    九度oj题目(吉大考研11年机试题全解) 吉大考研机试2011年题目: 题目一(jobdu1105:字符串的反码).    http://ac.jobdu.com/problem.php?pid=11 ...

  5. 九度oj 题目1007:奥运排序问题

    九度oj 题目1007:奥运排序问题   恢复 题目描述: 按要求,给国家进行排名. 输入:                        有多组数据. 第一行给出国家数N,要求排名的国家数M,国家号 ...

  6. 九度oj 题目1087:约数的个数

    题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...

  7. 九度OJ题目1105:字符串的反码

    tips:scanf,cin输入字符串遇到空格就停止,所以想输入一行字符并保留最后的"\0"还是用gets()函数比较好,九度OJ真操蛋,true?没有这个关键字,还是用1吧,还是 ...

  8. 九度oj题目1009:二叉搜索树

    题目描述: 判断两序列是否为同一二叉搜索树序列 输入:                        开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接 ...

  9. 九度oj题目1002:Grading

    //不是说C语言就是C++的子集么,为毛printf在九度OJ上不能通过编译,abs还不支持参数为整型的abs()重载 //C++比较正确的做法是#include<cmath.h>,cou ...

随机推荐

  1. Android商城开发系列(四)——butterknife的使用

    在上一篇博客:Android商城开发系列(三)——使用Fragment+RadioButton实现商城底部导航栏实现商城的底部导航栏时,里面用到了butterknife,今天来讲解一下的butterk ...

  2. 在windows 上编译部署Rap2

    在windows 上编译部署Rap2 引言 安装需要的环境 安装后端站点 创建数据库 在全局安装pm2 和 typescript 配置mysql,redis 数据库链接配置 初始化 编译 初始化数据库 ...

  3. Android(java)学习笔记125:保存数据到SD卡 (附加:保存数据到内存)

    1. 如果我们要想读写数据到SD卡中,首先必须知道SD的路径: File file = new File(Environment.getExternalStorageDirectory()," ...

  4. Python-OpenCV——亮度和对比度

    亮度与对比度 亮度调整是将图像像素的强度整体变大/变小,对比度调整指的是图像暗处变得更暗,亮出变得更亮,从而拓宽某个区域内的显示精度. OpenCV中亮度和对比度应用这个公式来计算:g(x) = αf ...

  5. Write Once, Run Anywhere:这不是Java,这是C#

    注意,本文目的并非挑起语言之争.虽然有为C#平反之意,但主要还是介绍Mono并进行简单的测试. UPDATED: 25th August 2012 更新了「Compile Once, Run Anyw ...

  6. Bootstrap历练实例:向列表组添加链接

    向列表组添加链接 通过使用锚标签代替列表项,我们可以向列表组添加链接.我们需要使用 <div> 代替 <ul> 元素.下面的实例演示了这点: <!DOCTYPE html ...

  7. Spring XML配置文件无法自动提示 eclipse中XML配置文件open with打开方式选择 XML Editor:注意它的编辑方式也是有两种的design和source

    双击XML配置文件,如果打开方式不正确 则如下图: 都是灰色显示,不会有自动提示,也不会有颜色标注 右击XML配置文件,选择打开方式为XML Editor,则会有颜色标注 如果此时没有自动提示 则要手 ...

  8. iOS开发遇到的坑之六--使用cocopods管理第三方库时,编译出现Library not found for -lPods问题的解决办法

    在项目中有时候会遇到Library not found for -lPods(这里的IPods指的是你具体的第三方库)的问题 出现这个错误的原因是:xcode在编译的时候找不到这个库,从而导致项目无法 ...

  9. C++函数的默认参数补充

    1.函数定义时指定默认参数 在C++中,定义函数时可以给形参指定一个默认的值,这样调用函数时如果没有给这个形参赋值(没有对应的实参),那么就使用这个默认的值.也就是说,调用函数时可以省略有默认值的参数 ...

  10. mysql EOF

    mysql shell 执行脚本 #!/bin/bash export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/mysql-5.6/bin:/usr ...