蛇形矩阵与螺旋矩阵

自己写的蛇形矩阵:(蛇形矩阵就是在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;
	}
}

输出样例:

蛇形矩阵与螺旋矩阵_第1张图片

自己写的螺旋矩阵:(螺旋矩阵像漩涡从外面开始旋转不断旋转到内部,可以是顺时针也可以是逆时针,本程序采用顺时针从外及里不断递增)

#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;
	}
}

输出样例:


以上两个程序均属于原创。

你可能感兴趣的:(蛇形矩阵与螺旋矩阵)