zoukankan      html  css  js  c++  java
  • 顺时针打印矩阵

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

              例如输入以下矩阵:

               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

      1 #include<stdio.h>
      2 #include<iostream>
      3 #include<tchar.h>
      4 
      5 void PrintMatrixInCircle(int** numbers, int columns, int rows, int start);
      6 void printNumber(int number);
      7 
      8 
      9 //方法1 
     10 void PrintMatrixClockwisely(int** numbers, int columns, int rows)
     11 {
     12     if(numbers == NULL || columns <= 0 || rows <= 0)
     13         return;
     14     
     15     int start = 0 ;
     16     
     17     while(columns > start * 2 && rows > start * 2)
     18     {
     19         PrintMatrixInCircle(numbers, columns, rows, start);
     20         
     21         ++start;
     22     }
     23 }
     24 
     25 //打印一圈 
     26 void PrintMatrixInCircle(int** numbers, int columns, int rows, int start)
     27 {
     28     // rows 行
     29     // columns 列 
     30     int endX = columns - 1 - start;   //x方向水平向右 
     31     int endY = rows - 1 - start;     //y方向垂直向下 
     32     
     33     //从左到右打印一行 
     34     for(int i = start; i <= endX; ++i)
     35     {
     36         int number = numbers[start][i];
     37         printNumber(number);
     38     }
     39     
     40     //从上到下打印一行
     41     if(start < endY) 
     42     {
     43         for(int i = start + 1; i <= endY; ++i)
     44         {
     45             int number = numbers[i][endX];
     46             printNumber(number);
     47         }
     48     }
     49     
     50     //从右到左打印一行
     51     if(start < endX && start < endY) 
     52     {
     53         for(int i = endX - 1; i >= start; --i)
     54         {
     55             int number = numbers[endY][i];
     56             printNumber(number);
     57         }
     58     }
     59     
     60     //从下到上打印一行
     61     if(start < endX && start < endY - 1) 
     62     {
     63         for(int i = endY - 1; i >= start + 1; --i)
     64         {
     65             int number = numbers[i][start];
     66             printNumber(number);
     67         }
     68     }
     69 }
     70 
     71 void printNumber(int number)
     72 {
     73     printf("%d	", number);
     74 }
     75 
     76 
     77 //方法2     
     78 void PrintMatrixCircle(int** numbers, int startX, int startY, int endX, int endY);
     79 void PrintMatrixClockwisely1(int** numbers, int columns, int rows)
     80 {
     81     if(numbers == NULL || columns <= 0 || rows <= 0)
     82         return;
     83 
     84     //rows 行
     85     //columns 列
     86     int startX = 0; 
     87     int startY = 0;
     88     int endX = rows - 1;      //x 方向垂直向下 
     89     int endY = columns - 1;  //y 方向水平向右 和方法1的x,y方法不同 不过并不重要 
     90     
     91     while(true)
     92     {
     93         if(startX > endX && startY > endY)
     94             break;
     95         if(startX == endX && startY > endY)
     96             break;
     97         if(startX > endX && startY == endY)
     98             break;
     99 
    100         PrintMatrixCircle(numbers, startX, startY, endX, endY);
    101         ++startX;
    102         ++startY;
    103         --endX;
    104         --endY;
    105     }
    106 }
    107 
    108 void PrintMatrixCircle(int** numbers, int startX, int startY, int endX, int endY)
    109 {
    110     //只有一行的情况,直接打印。 
    111     if(startX == endX && startY != endY)
    112     {
    113         for(int j = startY; j <= endY; ++j)
    114         {
    115             int number = numbers[startX][j];
    116             printNumber(number);
    117         }
    118     }
    119     
    120     
    121     //ps 当最后只有一个数字时,一行一列都打印,为了避免重复
    122     //在只有一行的情况下,加了一个 startY != endY. 
    123      
    124     //只有一列的情况,直接打印。 
    125     if(startY == endY)
    126     {
    127         for(int i = startX ; i <= endX; ++i)
    128         {
    129             int number = numbers[i][startY];
    130             printNumber(number);
    131         }
    132     }
    133     
    134     //打印一圈 
    135     for(int p = startY; p < endY; ++p)
    136     {
    137         int number = numbers[startX][p];
    138         printNumber(number);
    139     }
    140 
    141     for(int q = startX; q < endX; ++q)
    142     {
    143         int number = numbers[q][endY];
    144         printNumber(number);
    145     }
    146 
    147     for(int m = endY; m > startY ; --m)
    148     {
    149         int number = numbers[endX][m];
    150         printNumber(number);
    151     }
    152     for(int n = endX; n > startX; --n)
    153     {
    154         int number = numbers[n][startY];
    155         printNumber(number);
    156     }
    157 }
    158 
    159 
    160 
    161 int main(int argc, _TCHAR* argv[]) 
    162 {
    163     
    164     /*
    165     1    2    3    4    5
    166     6    7    8    9    10
    167     11   12   13   14   15
    168     16   17   18   19   20
    169     21   22   23   24   25
    170     */
    171     
    172     int columns = 5;
    173     int rows = 5;
    174     
    175     if(columns < 1 || rows < 1)
    176         exit(1);
    177 
    178     int** numbers = new int*[rows];
    179     for(int i = 0; i < rows; ++i)
    180     {
    181         numbers[i] = new int[columns];
    182         for(int j = 0; j < columns; ++j)
    183         {
    184             numbers[i][j] = i * columns + j + 1;
    185         }
    186     }
    187     printf("Solution1 Begin: %d columns, %d rows.
    ", columns, rows);
    188     PrintMatrixClockwisely(numbers, columns, rows);
    189     printf("
    ");
    190     printf("
    ");
    191     
    192     printf("Solution2 Begin: %d columns, %d rows.
    ", columns, rows);
    193     
    194     PrintMatrixClockwisely1(numbers, columns, rows);
    195     
    196     
    197     for(int i = 0; i < rows; ++i)
    198         delete[] (int*)numbers[i];
    199 
    200     delete[] numbers;
    201     printf("
    ");
    202     
    203     return 0;
    204 }

  • 相关阅读:
    Unique Binary Search Trees 解答
    Unique Paths II 解答
    Unique Paths 解答
    Maximum Subarray 解答
    Climbing Stairs 解答
    House Robber II 解答
    House Robber 解答
    Valid Palindrome 解答
    Container With Most Water 解答
    Remove Duplicates from Sorted List II 解答
  • 原文地址:https://www.cnblogs.com/sankexin/p/5618360.html
Copyright © 2011-2022 走看看