20-顺时针打印二维数组

一、题目描述

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

例如,如果输入如下矩阵:
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++;
    }
}


梦想还是要有的,万一实现了呢~~~ヾ(◍°∇°◍)ノ゙~~~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值