• 面试题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

    #include "stdafx.h"
    
    //方法一:递归方式;顺时针循环打印,一圈一圈的打印,先右,再下,再左,再上;打完一圈再打内圈,当不符合条件时,结束。 
    //参数:matrix:二维矩阵;columns:矩阵的列数;rows:矩阵的行数;start:一圈开始的左上角的坐标值(x、y坐标是相同的,例如5X5,第一圈左上角(start,start)即为(0,0)...) 
    
    void PrintMatrixRecursive(int matrix[][4],int columns,int rows,int start=0)
    {
    	if (!matrix||columns<1||rows<1)
    	{
    		return;
    	}
    	//递归终止条件
    	if (columns<=2*start||rows<=2*start)
    	{
    		return;
    	}
    
    	int stopx=columns-1-start;//一圈最右列在坐标中的位置
    	int stopy=rows-1-start;//一圈最大行在坐标中位置
    
    	//打印此圈中的最上行
    	for (int i=start;i<=stopx;i++)
    	{
    		printf("%d ",matrix[start][i]);
    	}
    	//打印此圈中的最右列
    	if (start<stopx)//如果此圈中不止有一列
    	{
    		for (int i=start+1;i<=stopy;i++)
    		{
    			printf("%d ",matrix[i][stopx]);
    		}
    	}
    	//打印次圈中的最下行 
    	if (start<stopx&&start<stopy)
    	{
    		for (int i=stopx-1;i>=start;i--)
    		{
    			printf("%d ",matrix[stopy][i]);
    		}
    	}
    	//打印次圈中的最左行 
    	if (start<stopx&&start<stopy-1)
    	{
    		for (int i=stopy-1;i>=start+1;i--)
    		{
    			printf("%d ",matrix[i][start]);
    		}
    	}
    	PrintMatrixRecursive(matrix,columns,rows,start+1);//递归调用打印下一圈
    }
    
    //非递归方式,其主要思想和递归相同,只是增加循环判断打印函数的退出条件
    void PrintMatrix(int matrix[][4],int columns,int rows,int start);//打印矩阵单圈的函数声明
    void PrintMatrixCircle(int matrix[][4],int columns,int rows)
    {
    	if (!matrix||columns<1||rows<1)
    	{
    		return;
    	}
    	int start=0;
    	while(columns>start*2&&rows>start*2)
    	{
    		PrintMatrix(matrix,columns,rows,start);
    		++start;
    	}	
    }
    
    //打印矩阵单圈的函数
    void PrintMatrix(int matrix[][4],int columns,int rows,int start)
    {
    	int stopx=columns-1-start;//一圈最右列在坐标中的位置
    	int stopy=rows-1-start;//一圈最大行在坐标中位置
    
    	//打印此圈中的最上行
    	for (int i=start;i<=stopx;i++)
    	{
    		printf("%d ",matrix[start][i]);
    	}
    	//打印此圈中的最右列
    	if (start<stopx)//如果此圈中不止有一列
    	{
    		for (int i=start+1;i<=stopy;i++)
    		{
    			printf("%d ",matrix[i][stopx]);
    		}
    	}
    	//打印次圈中的最下行 
    	if (start<stopx&&start<stopy)
    	{
    		for (int i=stopx-1;i>=start;i--)
    		{
    			printf("%d ",matrix[stopy][i]);
    		}
    	}
    	//打印次圈中的最左行 
    	if (start<stopx&&start<stopy-1)
    	{
    		for (int i=stopy-1;i>=start+1;i--)
    		{
    			printf("%d ",matrix[i][start]);
    		}
    	}
    }
    
    
    //简单测试,打印5x4矩阵
    int main()
    {
    	int matrix[][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16},{17,18,19,20}};
    	printf("递归方式实现:  ");
    	PrintMatrixRecursive(matrix,4,5);
    	printf("
    非递归方式实现:");
    	PrintMatrixCircle(matrix,4,5);
    	printf("
    ");
    	return 0;
    }

    截图00

  • 相关阅读:
    BlockUI常见问题
    AssemblyInfo文件
    asp.net 如何让虚拟目录里面的webconfig不继承主目录config(转)
    jquery Ajax示例
    jQuery Ajax 实例 全解析 (转)
    如何在ASP.NET服务器控件库中嵌入JavaScript脚本文件(转)
    如何使用ASP.NET2.0的“嵌入的资源”(转)
    BlockUI对话框
    Jquery ajax参数设置
    What's production quality
  • 原文地址:https://www.cnblogs.com/hdk1993/p/4396360.html
Copyright © 2020-2023  润新知