一、题目描述
输入一个矩阵,按照从外到里以顺时针的顺序依次打印出每一个数字,
例如,如果输入如下矩阵: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)顺时针旋转几次结束?
2)如何实现顺时针打印?
针对第1点:每次顺时针的起始位置都在主对角线位置[start,start],而且当
start*2<ColumnSize && start*2<RowSize时,可继续旋转
针对第2点:要仔细分析从左到右、从上到下、从右到左、从下到上的前提条件:
从左到右:这一步是必须的,因为打印一圈至少有一步或者一行
从上到下:终止行号endX > 起始行号start
从右到左:终止行号endX > 起始行号start 并且 终止列号endY > 起始列号start
从下到上:终止行号比起始行号至少大1 并且终止列号endY > 起始列号start
三、解题算法
/***************************************************************
Author:tmw
date:2018-6-30
****************************************************************/
#include <stdio.h>
#include <stdlib.h>
/**
* 实现顺时针打印算法
* @param **matrix
* @param ColumSize
* @param RowSize
* @param start -- 新一轮起始位置
*
* 注:本代码未经测试,看逻辑就好
*/
void Print_func( int** matrix, int ColumSize, int RowSize, int start )
{
/**先计算当前轮终止行号和终止列号**/
int endX = ColumSize-1-start;//横坐标---列距
int endY = RowSize-1-start; //纵坐标---行距
int i;
/**从左到右打印一行**/
for( i=start; i<=endX; i++ )
printf("%d ",matrix[start][i]);
/**从上到下打印一列**/
if( start < endY )
{
for( i=start+1; i<=endY; i++ )
printf("%d ",matrix[i][endX]);
}
/**从右到左打印一行**/
if( start < endY && start < endX )
{
for( i=endX-1; i>=start; i-- )
printf("%d ",matrix[endY][i]);
}
/**从下到上打印一列**/
if( start < endX && start < endY-1 )
{
for( i=endY-1; i>=start+1; i-- )
printf("%d ",matrix[i][start]);
}
}
/**
* 主功能函数
*/
void Print_matrix_circle( int** matrix, int ColumSize, int RowSize )
{
/**输入参数判定**/
if( matrix == NULL || ColumSize<=0 || RowSize<=0 )
return;
int start = 0;
/**控制顺时针多少圈结束**/
while( start*2 < ColumSize && start*2 < RowSize )
{
Print_func( matrix, ColumSize, RowSize, start );
start++;
}
}
梦想还是要有的,万一实现了呢~~~ヾ(◍°∇°◍)ノ゙~~~~