[笔试] 打印螺旋矩阵

问题:打印如下的螺旋矩阵:


21      22      23      24      25
20       7        8        9        10
19       6        1        2        11
18       5        4        3        12
17      16      15      14      13


解法一:

观察到矩阵从中心位置(i,j)开始以螺旋的顺序递增

(i,j) --> (i,j+1) --> (i+1,j+1) -->...

可以发现从中心位置开始,对纵坐标、横坐标依次处理:

j  +1

i  +1

j  -2

i  -2

j  +3

i  +3

……

按照如上的顺序可以构造出矩阵,代码如下:

#include <iostream>
using namespace std;

int main()
{
	int N;
	cout<<"input the row number of the matrix: (odd number)"<<endl;
	cin>>N;

	int **a=new int*[N];
	for(int m=0;m<N;++m)
		a[m]=new int[N];

	int i=N/2,j=N/2;
	int num=1;

	for(int k=0;k<=N;++k){
		for(int t=0;t<k;++t){
			a[i][j]=num;
			j += (k%2==0?-1:1);
			++num;
		}

		if(k==N)
			break;

		for(int t=0;t<k;++t){
			a[i][j]=num;
			i += (k%2==0?-1:1);
			++num;
		}
		
	}

	for(int i=0;i<N;++i){
		for(int j=0;j<N;++j)
			cout<<a[i][j]<<'\t';
		cout<<endl;
	}
}


解法二:

参见

http://blog.csdn.net/hust_cs_student/article/details/5356013


#include <iostream>
using namespace std;

#define max(a,b) (a<b?b:a)
#define abs(a) (a>0?a:-a)

int foo(int x,int y)
{
	int t=max(abs(x),abs(y));
	int u=2*t;
	int v=u-1;
	v=v*v+u;
	if(x==-t)
		v += u+t-y;
	else if(y==-t)
		v += 3*u+x-t;
	else if(y==t)
		v += t-x;
	else
		v += y-t;
	return v;
}


int main()
{
	int N;
	cin>>N;

	for(int y=-N;y<=N;++y){
		for(int x=-N;x<=N;++x)
			cout<<foo(x,y)<<'\t';
		cout<<endl;
	}
	return 0;
}


你可能感兴趣的:([笔试] 打印螺旋矩阵)