蛇形矩阵与螺旋矩阵
Posted Flammable_ice
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蛇形矩阵与螺旋矩阵相关的知识,希望对你有一定的参考价值。
自己写的蛇形矩阵:(蛇形矩阵就是在NXN矩阵格子上从左上到右下以“之”字型增加或减少,像蛇盘绕着的形状。本程序从左上开始盘旋一直到右下达到最大值)
#include <iostream>
using namespace std;
#define n 10//输入要更改的矩阵大小
void main()
int a[n][n]=0,k=1,j=0,i=0,s1[4]=0,1,2,3,t1[4]=1,1,2,2,m=0;
for (int t=1;t<=n;t++) m+=t;
while(k!=m+1)//左上三角形
if (s1[0]==k-1)
a[i][j]=k++;
j++;
s1[0]+=2*t1[0]+3;
t1[0]+=2;
else if (s1[1]==k-1)
int t=t1[1];
while(t--)
a[i][j]=k++;
i++;j--;
s1[1]+=2*t1[1]+3;
t1[1]+=2;
else if (s1[2]==k-1)
a[i][j]=k++;
i++;
s1[2]+=2*t1[2]+3;
t1[2]+=2;
else //if(s1[3]==k-1)
int t=t1[3];
while (t--)
a[i][j]=k++;
i--;j++;
s1[3]+=2*t1[3]+3;
t1[3]+=2;
j=n-1,i=n-1,k=n*n;
int s2[4]=n*n-1,n*n-2,n*n-3,n*n-4,t2[4]=1,1,2,2;
while (k!=m)//右下三角形
if (s2[0]==k-1)
a[i][j]=k--;
j--;
s2[0]-=2*t2[0]+3;
t2[0]+=2;
else if (s2[1]==k-1)
int p=t2[1];
while(p--)
a[i][j]=k--;
i--;j++;
s2[1]-=2*t2[1]+3;
t2[1]+=2;
else if (s2[2]==k-1)
a[i][j]=k--;
i--;
s2[2]-=2*t2[2]+3;
t2[2]+=2;
else //if(s2[3]==k-1)
int p=t2[3];
while (p--)
a[i][j]=k--;
i++;j--;
s2[3]-=2*t2[3]+3;
t2[3]+=2;
for (i=0;i<n;i++)
for (j=0;j<n;j++)
cout<<a[i][j]<<" ";
cout<<endl;
输出样例:
自己写的螺旋矩阵:(螺旋矩阵像漩涡从外面开始旋转不断旋转到内部,可以是顺时针也可以是逆时针,本程序采用顺时针从外及里不断递增)
#include <iostream>
using namespace std;
#define N 6//输入矩阵的规模
void main()
int a[N][N]=0,k=1,i=0,j=N-1,p=0,t=1,q=N;//数据初始化
while(k!=N*N+1)
//以下判断语句是分成正方形四条边四种情况讨论。
if ((i==p||i<N-p-1)&&j==N-p-1)//||(i==p&&j==n-p-1))
a[i][j]=k++;
i++;
else if (j>p&&i==N-p-1)
a[i][j]=k++;
j--;
else if (i>p&&j==p)
a[i][j]=k++;
i--;
else if (j<N-p-1&&i==p)
a[i][j]=k++;
j++;
if(t==4*q-4)//4*q-4为每圈数据个数。
q-=2;//每圈的边,每一圈过后,边都要减少2个单位
p++;//每圈过后,遍历的起始数据增1,我们从外圈向里圈遍历。
t=0;//每圈遍历过后,计数器归0。
i=p;//每圈遍历过后,设置i和j以回归正确的遍历位置。
j=N-p-1;//每圈遍历过后,设置i和j以回归正确的遍历位置。
t++;
//时间复杂度为O(N)
for (i=0;i<N;i++)
for (j=0;j<N;j++)
cout<<a[i][j]<<"\\t";
cout<<endl;
输出样例:
以上两个程序均属于原创。
以上是关于蛇形矩阵与螺旋矩阵的主要内容,如果未能解决你的问题,请参考以下文章