与下面的方阵类似的方阵称为回形方阵:1 2 3 4 5 6 724 25 26 27 28 29 823 40 41 42 43 30 922 39 48 49 44 31 1021 38 47 46 45 32 1120 37 36 35 34 33 1219 18 17 16 15 14 13算法一:[水生版]#define N 10main(){int i,j,a[N][N],n,k,p=1;//n是一行或一列的大小,p是控制方向的scanf("%d",&n);for(i=0;i<n;i++) for(j=0;j<n;j++) a[i][j]=0;i=0;j=0;for(k=1;k<=n*n;k++){a[i][j]=k;switch (p){ case 1:if((j==n-1)||(a[i][j+1]!=0)) {p=2;i++;} else j++;break; case 2:if((i==n-1)||(a[i+1][j]!=0)) {p=3;j--;} else i++;break; case 3:if((j==0)||(a[i][j-1]!=0)) {p=4;i--;} else j--;break; case 4:if((j==n-1)||(a[i-1][j]!=0)) {p=1;j++;} else i--;break;}}for(i=0;i<n;i++){ for(j=0;j<n;j++) printf("%3d",a[i][j]); printf("\n");}}算法二:[do熊版]#include <stdio.h>#define N 10int main(){ int a[N][N],n=0; int i,j,k,count; int cornor[2*(N-1)],p=0; //cornor存储拐角处元素的值,p表示前进方向(右、下、左、上). while(n<1||n>10) //从键盘接收n. { printf("Please enter n(0<n<=10):"); scanf("%d",&n)?(n<1||n>10)?printf("error!"):0:(printf("error!"),fflush(stdin)); } cornor[0]=n; //计算拐角处元素的值. for(i=1,j=n-1;i<2*(n-2);i+=2) { cornor[i]=cornor[i-1]+j; cornor[i+1]=cornor[i]+j--; } cornor[i]=cornor[i-1]+1; i=j=0; //赋值 for(count=1,k=0;count<=n*n;count++) { a[i][j]=count; if(count==cornor[k]) //判断是否转弯,并处理 { k++; p=(++p)%4; } if(p==0) j++; //向右 else if(p==1) i++; //向下 else if(p==2) j--; //向左 else i--; //向上 } for(i=0;i<n;i++) //打印结果 { for(j=0;j<n;j++) printf("%5d",a[i][j]); printf("\n"); } printf("\n\n"); system("PAUSE"); return 0;} 算法三:[rickone版]#include<stdio.h>#define N 8void solve(int *m,int dim, int width,int first)/*m:首地址dim:维数width:宽first:首元素值*/{ int i; /*维数为偶数的情况*/ if(width==0)return; /*维数为奇数的情况*/ if(width==1){*m=first;return;} /*画四周*/ for(i=0;i<width;++i) m[i]=first++; for(i=1;i<width;++i) m[i*dim+width-1]=first++; for(i=1;i<width;++i) m[(width-1)*dim+width-1-i]=first++; for(i=1;i<width-1;++i) m[width*dim-dim-i*dim]=first++; /*分成小问题*/ solve(m+dim+1,dim,width-2,first);}void display(int *m,int dim){ int i,j; for(i=0;i<dim;++i) for(j=0,printf("\n");j<dim;++j) printf("%4d",m[i*dim+j]);}void main(){ int m[N][N]; solve(*m,N,N,1); display(*m,N);}

评论