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 }

  • 相关阅读:
    JS内容左右滑动
    JS返回上一页
    两栏 三栏的css
    舅舅去世
    .net学习开始
    以论坛管理的方式来处理公司资讯
    《尽管去做》摘
    网页视频播放器代码集
    火影忍者和海贼王
    古代风水文献
  • 原文地址:https://www.cnblogs.com/sankexin/p/5618360.html
Copyright © 2011-2022 走看看