问题:打印如下的螺旋矩阵:
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.youkuaiyun.com/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;
}