本文讨论一些特殊矩阵的打印方法
- int getNumberWidth(int number){//获取number的位数
- int width=0;
- while(number){
- number/=10;
- width++;
- }
- return width;
- }
- //n=5:
- //1 2 9 10 25
- //4 3 8 11 24
- //5 6 7 12 23
- //16 15 14 13 22
- //17 18 19 20 21
- void printMatrix(int size){
- int width=getNumberWidth(size*size);
- width++;
- setfill(' ');
- cout.flags(ios::left);
- int start=1;
- int colStep;
- for(int i=1;i<=size;i++){
- colStep=i%2?1:-1;
- int pre=i%2?start-1:start+(4*(i-1)+1);
- start=pre;
- for(int j=1;j<=size;j++){
- if(j<=i)
- cout<<setw(width)<<(pre=pre+colStep);
- else
- if(j%2==0)
- cout<<setw(width)<<(pre=pre+2*i-1);
- else
- printf(t,(pre=pre+4*(j-1)-2*i+1));
- }
- cout<<endl;
- }
- }
- //n=6
- //1 2 2 2 2 1
- //1 2 3 3 2 1
- //1 2 3 3 2 1
- //1 2 3 3 2 1
- //1 2 3 3 2 1
- //1 1 1 1 1 1
- void printmatrix(int n) {
- for (int ii=0, maxval=2, delta=2; ii < n; ++ii, maxval+=delta) {
- if (ii == (n>>1)) {
- delta = -2;
- maxval -= (n & 1) ? 1 : 3;
- }
- for (int jj = 0 ; jj < n; ++jj) {
- int curval = (jj < (n>>1)) ? jj+1 : n-jj;
- cout << min(curval, maxval) << ' ';
- }
- cout << endl;
- }
- cout << endl;
- }
- //数组螺旋方向
- enum Direction{
- LeftTop,//数组第一个元素位于左上角
- RightTop,//数组第一个元素位于右上角
- LeftBottom,//数组第一个元素位于左下角
- RightBottom//数组第一个元素位于右下角
- };
- //数组顺时针还是逆时针旋转
- enum Wise{
- CounterClock,
- Clock
- };
- //获取螺旋数组指定i,j位置的值
- int getCircleNumber(int n,int i,int j,Direction direction,Wise wise,int base=1){
- int index=min(i,j);
- index=min(index,n-max(i,j)-1);
- int len=n-2*index-1;
- int first=base+4*index*(n-index);
- int bound=len+index;
- if(i==index)//数组第一个元素位于左上角的情况
- first+=wise==Clock?j-index:i==j?0:3*len+(bound-j);
- else if(i==bound){
- first+=wise==Clock?2*len+(bound-j):len+(j-index);
- }
- else if(j==index){
- first+=wise==Clock?3*len+(bound-i):i-index;
- }
- else
- first+=wise==Clock?len+(i-index):2*len+(bound-i);
- switch(direction){
- case LeftTop:
- break;
- case RightTop://右上角情况,相当于左上角的情况旋转90度
- if(i==index)
- first+=wise==Clock?(j!=bound?3*len:-len):(i!=j?-3*len:len);
- else
- first+=wise==Clock?-len:len;
- break;
- case RightBottom://旋转180度
- if(i==index || (j==bound &&i!=bound))
- first+=wise==Clock?2*len:(i!=j?-2*len:2*len);
- else
- first+=wise==Clock?-2*len:i!=j?2*len:-2*len;
- break;
- case LeftBottom://旋转270度
- if(j==index)
- first+=wise==Clock?(i!=index?-3*len:len):(i!=bound?3*len:-len);
- else
- first+=wise==Clock?len:-len;
- break;
- }
- return first;
- }
- //n=5
-
- //1 2 3 4 5
- //16 17 18 19 6
- //15 24 25 20 7
- //14 23 22 21 8
- //13 12 11 10 9
- void print2Matrix(int n,Direction direction,Wise wise,int base=1){
- int width=getNumberWidth(n*n);
- width++;
- setfill(' ');
- cout.flags(ios::left);
- for(int i=0;i<n;i++){
- for(int j=0;j<n;j++){
- cout<<setw(width)<<getCircleNumber(n,i,j,direction,wise,base)<<" ";
- }
- cout<<endl;
- }
- }
- //n=7
- //7 8 9 4 5 6 7
- //6 13 10 3 12 13 8
- //5 12 11 2 11 10 9
- //4 3 2 1 2 3 4
- //9 10 11 2 11 12 5
- //8 13 12 3 10 13 6
- //7 6 5 4 9 8 7
- void print4Matrix(int n){
- int len=n>>1;
- int width=getNumberWidth(len*len+len+2);
- width++;
- setfill(' ');
- cout.flags(ios::left);
- for(int i=0;i<n;i++){
- int num=0;
- int ii=i<len?i:i-len-1;
- for(int j=0;j<n;j++){
- Direction dire;
- if(i<len)
- dire=j<len?LeftBottom:LeftTop;
- else
- dire=j<len?RightBottom:RightTop;
- if(i==len)//两个中轴线的情况,横轴
- num=j<=len?(len+1-j):(j-len+1);
- else if(j==len)//竖轴
- num=i<=len?(len+1-i):(i-len+1);
- else{//分别处理四角螺旋矩阵
- num=getCircleNumber(len,ii,j<len?j:j-len-1,dire,Clock,len+2);
- }
- cout<<setw(width)<<num<<' ';
- }
- cout<<endl;
- }
- }