顺时针打印矩阵的形式:
顺时针打印矩阵 的方法应该有不少,对于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;
}