面试题20:顺时针打印矩阵

本文介绍了一种按顺时针方向从外向内打印矩阵的方法。通过定义矩形的边界,利用双指针技巧实现逐层打印,最终完成整个矩阵的遍历。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

例如:


分析:
分析循环打印的规律可以发现,每次打印都是往矩阵的内部缩小了一周,这样的话可以可以用两个坐标点来确定这样一个矩形的左上角顶点和右下角顶点,然后依据两个点确定的范围来打印,按照从左到右,从上到下,从右到左,从下到上的顺序打印。

源码:

/**/
#include<iostream>
using namespace std;
//确定打印的矩形框
void PrintStart(int**a, int row,int col);
//按照四种顺序依次打印
void PrintCircle(int** a, int start,int endX,int endY);
int main()
{
	int** numbers = new int*[4];
	cout<<"the original matrix :"<<endl;
    for(int i = 0; i < 4; ++i)
    {
        numbers[i] = new int[4];
        for(int j = 0; j < 4; ++j)
        {
            numbers[i][j] = i * 4 + j + 1;
			printf("%3d  ",numbers[i][j]);
        }
		cout<<endl;
    }
	cout<<"the output is : "<<endl;
	PrintStart(numbers,4,4);
	system("PAUSE");
	return 0;
}
void PrintStart(int** a, int row,int col)
{
	int start=0;//左上角位置
	int endX=row-1;//右上角位置
	int endY=col-1;
	while(start<=endX&&start<=endY)//逐步缩小范围
	{
		PrintCircle(a, start,endX,endY);
		start++;
		endX--;
		endY--;
	}
	cout<<endl;
	
}
void PrintCircle(int** a, int start,int endX,int endY)
{
	//从左往右打印
	for(int i=start;i<endY;i++)//行末尾少打印一个,以免重复
	{
		cout<<a[start][i]<<"  ";
	}
	//从上到下打印
	for(int i=start;i<endX;i++)
	{
		cout<<a[i][endY]<<"  ";
	}
	//从右往左打印
	for(int i=endY;i>start;i--)
	{
		cout<<a[endX][i]<<"  ";
	}
	//从下往上打印
	for(int i=endX;i>start;i--)
	{
		cout<<a[i][start]<<"  ";
	}
}

结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值