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