自己写的蛇形矩阵:(蛇形矩阵就是在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; } }
输出样例:
以上两个程序均属于原创。