//经典矩阵问题是利用数字生成一个矩阵,而该矩阵刚好是一个正方形,该矩阵内的数字是有//规律的排序而形成矩阵。比较常见有以下形式//1.//12910//43811//56712//16151413//2.//1267//35813//491214//10111516//3.//1234//1213145//1116156//10987//4.//76516//81415//92314//10111213#include<iostream>usingnamespacestd;constintN=5;//可修改inta[N][N];voidPrint(intn){for(inti=0;i<n;++i){for(intj=0;j<n;++j)printf("%-2d",a[i][j]);cout<<endl;}cout<<endl;}voidRectangle1(){inti=0,j=0;intlap=1,m=1,n;//cout<<"pleaseinputn行数";//cin>>n;n=4;a[i][j]=m++;lap++;while(lap<=n){if(lap%2==0){for(j++;i<lap;i++)a[i][j]=m++;i--;for(j--;j>=0;j--)a[i][j]=m++;j++;}else{for(i++;j<lap;j++)a[i][j]=m++;j--;for(i--;i>=0;i--)a[i][j]=m++;i++;}lap++;}Print(n);}voidRectangle2(){inti=0,j=0;ints=1,nNum=1;//s标记升降方向,斜向上为升s=1,斜向下为降s=-1intn=4;while(1){if(s==1){a[i][j]=nNum;if(i-1<0){if(j+1==n)i++;elsej++;s=-1;}elseif(j+1==n){i++;s=-1;}else{i--;j++;}}else{a[i][j]=nNum;if(j-1<0){if(j+1==n)j++;elsei++;s=1;}elseif(i+1==n){j++;s=1;}else{i++;j--;}}nNum++;if(nNum>n*n)break;}Print(n);}voidRectangle3(){inti=0,j=0;intn=4;intx1=0,x2=n,y1=0,y2=n;//分别表示上下左右intm=1,s=1;//s=1表示升序,s=-1表示降序while(1){if(s==1){for(j;j<y2;++j)a[i][j]=m++;j--;i++;y2--;for(i;i<x2;++i)a[i][j]=m++;i--;j--;x2--;s=-1;}else{for(j;j>=y1;--j)a[i][j]=m++;j++;i--;y1++;for(i;i>=x1+1;--i)a[i][j]=m++;i++;j++;x1++;s=1;}if(m>n*n)break;}Print(n);}voidRectangle4(){inti=0,j=0;intn=4;intm=n*n;intx1=0,y1=0,x2=n,y2=n;ints=1;if(n%2==0){j=n-1;y2=n-1;s=1;}else{i=n-1;y1=1;s=-1;}while(1){if(s==1){for(i;i<x2;++i)a[i][j]=m--;i--;j--;x2--;for(j;j>=y1;--j)a[i][j]=m--;j++;i--;y1++;s=-1;}else{for(i;i>=x1;--i)a[i][j]=m--;i++;j++;x1++;for(j;j<y2;++j)a[i][j]=m--;j--;i++;y2--;s=1;}if(m<1)break;}Print(n);}intmain(){Rectangle1();Rectangle2();Rectangle3();Rectangle4();system("pause");return0;}