九度OJ-题目1391:顺时针打印矩阵

题目链接地址:

九度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


解题思路:

设立4个变量up,down,left,right分别对应打印矩阵的上,下,左,右4个边界,顺时针打印矩阵分为以下4步:
(1) 从左至右打印矩阵的第up行,打印完以后令up++,表示该行元素已经被打印完;
(2) 从上至下打印矩阵的第right列,打印完以后令right--,表示该列元素已经被打印完;
(3) 从右至左打印矩阵的第down行,打印完以后令down--,表示该行元素已经被打印完;
(4) 从下至上打印矩阵的第left列,打印完以后令left++,表示该列元素已经被打印完。
重复以上4个步骤,直至矩阵中所有的元素都被打印完为止。

AC代码如下:

// 顺时针方向打印矩阵
#include<stdio.h>
#define MAX 1000
int matrix[MAX][MAX];
 
/**
* 输入矩阵
* @param m  矩阵的行数
* @param n  矩阵的列数
* @return void
*/
void inputMatrix(int m,int n)
{
   int i,j;
   for(i = 0;i < m;i++)
   {
       for(j = 0;j < n;j++)
       {
          scanf("%d",&matrix[i][j]);
       }
   }
   return;
}
 
/**
* 顺时针输出矩阵 注意最后一个元素后面也要输出空格
* @param m  矩阵的行数
* @param n  矩阵的列数
* @return void
*/
void clockwisePrintMatrix(int m,int n)
{
   int i,j;
   int up,down,left,right;              // 上,下,左,右 边界
   up = 0,down = m - 1;
   left = 0,right = n - 1;              // 从matrix[0][1]开始遍历
   while(1)
   {
    // 从左往右遍历
    i = up;
    for(j = left;j <= right;j++)
    {
       printf("%d ",matrix[i][j]);
    }
    if(up < down)
    {
      up++;            // 表示第up行的元素已经遍历完了
    }
    else               // 表示已经遍历到了最后一个元素
    {
       break;
    }
    // 从上往下遍历
    j = right;
    for(i = up;i <= down;i++)
    {
      printf("%d ",matrix[i][j]);
    }
    if(right > left)
    {
      right--;           // 表示第right列的元素已经遍历完了
    }
    else                 // 表示已经遍历到了最后一个元素
    {
      break;
    }
    // 从右往左遍历
    i = down;
    for(j = right;j >= left;j--)
    {
      printf("%d ",matrix[i][j]);
    }
    if(down > up)
    {
      down--;              // 表示第down行的元素已经遍历完了
    }
    else                   // 表示已经遍历到了最后一个元素
    {
       break;
    }
    // 从下往上遍历
    j = left;
    for(i = down;i >= up;i--)
    {
       printf("%d ",matrix[i][j]);
    }
    if(left < right)
    {
      left++;            // 表示第left列的元素已经遍历完了
    }
    else                 // 表示已经遍历到了最后一个元素
    {
       break;
    }
   }//while(1)
   printf("\n");
   return;
}
 
int main()
{
    int m,n;
    while(EOF != scanf("%d%d",&m,&n))
    {
        inputMatrix(m,n);
        clockwisePrintMatrix(m,n);
    }
    return 0;
}
 
/**************************************************************
    Problem: 1391
    User: blueshell
    Language: C
    Result: Accepted
    Time:540 ms
    Memory:4820 kb
****************************************************************/


你可能感兴趣的:(面试题,剑指offer)