顺时针打印矩阵

本文介绍了顺时针打印矩阵的方法,包括设立标志位的传统方式和使用四个游标实现的聪明方法,后者无需标志位,能更高效地完成打印。
摘要由CSDN通过智能技术生成

顺时针打印矩阵的形式:



顺时针打印矩阵 的方法应该有不少,对于N*N的矩阵最简单可能是设立标志位的形式  每次死板从左到右, 从上到下,从右到左,从下到上打 

聪明方法设立四个游标首尾相连的打不需要标志位



#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<windows.h>
using namespace std;
inline  int Max(int a,int b){return a>b? a:b;}
int spiral(int x,int y)//螺旋矩阵
{
    int c=Max(abs(x),abs(y));//计算出当前坐标所在圈
	int max=(2*c+1)*(2*c+1);//当前圈上最大值
	if(y==-c)//上边
	{
	    return max+x+y;
	}
	else if(x==-c)//左边
	{
		return max+3*x-y;
	}
	else if(y==c)//下边
	{
	   return max-5*y-x;
	}
	else if(x==c)//右边
	{
		return max-7*x+y;
	}
}
//方法一比较笨的方法
void PrintMatrix(int n)//顺时针打印矩阵设立标志位
{
	 int ** a=new int *[n];
	 for(int i=0;i<n;i++)
	 {
	      a[i]=new int[n];
	 }
     for(int i=0;i<n;i++)//初始转态设立标志位0
	 {
	     for(int j=0;j<n;j++)
		 {
		     a[i][j]=0;
		 }
	 }
	 int number=0;
	 int i1=0,i2=n-1,i3=n-1,i4=0;
	 int N=n*n;
	 while(number<N)
	 {
	     for(int i=0;i<n&&i1<n;i++)//i1是从左到右打的行号
		 {
			  if( a[i1][i]==0)
		     a[i1][i]=++number;
		 }
		 i1++;
		 for(int i=0;i<n&&i2>=0;i++)//i2是从上到下打的列号
		 {
			  if( a[i][i2]==0)
		     a[i][i2]=++number;
		 }
		 i2--;
		 for(int i=n-1;i>=0&&i3>=0;i--)//i3是从右到左打行号
		 {
			 if( a[i3][i]==0)
		     a[i3][i]=++number;
		 }
		 i3--;
		 for(int i=n-1;i>=0&&i4<n;i--)//i4从下到上打的列号
		 {   
			 if( a[i][i4]==0)
		     a[i][i4]=++number;
		 }
		 i4++;
	 }
	 for(int i=0;i<n;i++)//打印矩阵
	 {
	     for(int j=0;j<n;j++)
		 {
		     cout<<a[i][j]<<" ";
		 }
		 cout<<endl;
	 }
	 for(int i=0;i<n;i++)
	 {
	      delete a[i];
	 }
	 delete a;
}
//以下这种方法特别好 无需设立标志位  对于a[m][n] 矩阵也也可以用这种方法
/*
 -------i1--------->|
 |                  |
 | 					i2
 i4	                |
 |					|
 |---------i3--------					-
 i1,i2,i3,i4 四个游标首尾相连构成一个圈 每次都缩小圈,但number==N时跳出循环
 */
void PrintMatrix2(int n)//顺时针打印矩阵无需设立标志位效率更高,i1,i2,i3,i4 首尾相连接即可
{
	 int ** a=new int *[n];
	 for(int i=0;i<n;i++)
	 {
	      a[i]=new int[n];
	 }
	 int number=0;
	 int i1=0,i2=n-1,i3=n-1,i4=0;
	 int N=n*n;
	 while(number<N)
	 {
	     for(int i=i4;i<=i2&&number<N;i++)//i1是从左到右打的行号   i起始点和终止点         i4加加 加到i2
		 {
		     a[i1][i]=++number;
		 }
		 i1++;
		 for(int i=i1;i<=i3&&number<N;i++)//i2是从上到下打的列号  i起始点和终止点          i1 加加加到i3
		 {
			  
		     a[i][i2]=++number;
		 }
		 i2--;
		 for(int i=i2;i>=i4&&number<N;i--)//i3是从右到左打行号    i起始点和终止点          i2 减减减到i4
		 {
		     a[i3][i]=++number;
		 }
		 i3--;
		 for(int i=i3;i>=i1&&number<N;i--)//i4从下到上打的列号   打印i4列时 i起始点和终止点  i3减减减到i1
		 {   
		     a[i][i4]=++number;
		 }
		 i4++;
	 }
	 for(int i=0;i<n;i++)//打印矩阵
	 {
	     for(int j=0;j<n;j++)
		 {
		     cout<<a[i][j]<<" ";
		 }
		 cout<<endl;
	 }
	 for(int i=0;i<n;i++)
	 {
	      delete []a[i];
	 }
	 delete[] a;
}
int main()
{
	cout<<"please input n"<<endl;
	int n;
	cin>>n;
	PrintMatrix2(n);
	while(1)
	{
	cout<<"please input x,y"<<endl;
	int x,y;
	cin>>x>>y;
	cout<<spiral(x,y)<<endl;
	}
    return 0;
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值