PAT数组-13. 螺旋方阵(20)

来源:互联网 发布:禅道数据库配置文件 编辑:程序博客网 时间:2024/05/22 10:38

数组-13. 螺旋方阵(20)

时间限制
400 ms
内存限制
32000 kB
代码长度限制
8000 B
判题程序
Standard

所谓“螺旋方阵”,是指对任意给定的N,将1到N*N的数字从左上角第1个格子开始,按顺时针螺旋方向顺序填入NxN的方阵里。本题要求构造这样的螺旋方阵。

输入格式:

输入在一行中给出一个正整数N(<10)。

输出格式:

输出NxN的螺旋方阵。每行N个数字,每个数字占3位。

输入样例:
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
注释的代码是本人写的程序有点复杂, 第二种是参考网上的代码,比较好
#include<stdio.h>#define SIZE 10/*int main(){int a[SIZE][SIZE];int recycleNum;  //循环次数int N,i,s,x,z,y; //s:上        x:下         z:左           y:右scanf("%d",&N);if(N%2==0)recycleNum=N/2;elserecycleNum=(N+1)/2;int num=0;for(i=0;i<recycleNum;i++)  //循环recycleNum次{for(s=0;s<N-i*2;s++)  //上边: 从左往右 ,遍历N-i*2次{num++;a[i][i+s]=num;//printf("a[%d][%d]:%d\n",i,i+s,num);}  //最右边的坐标是(i,i+s-1)for(y=0;y<N-i*2-1;y++) //右边:从上往下,遍历N-i*2-1次{num++;a[i+1+y][i+s-1]=num;//printf("a[%d][%d]:%d\n",i+1+y,i+s-1,num);}//最下边的坐标是(i+y,i+s-1)for(x=0;x<N-i*2-1;x++) //下边: 从右往左,遍历N-i*2-1次{num++;a[i+y][i+s-2-x]=num;//printf("a[%d][%d]:%d\n",i+y,i+s-2-x,num);}//最左边的坐标是(i+y,i+s-1+x)for(z=0;z<N-i*2-2;z++) //左边: 从下往上,遍历N-i*2-2次{num++;a[i+y-1-z][i+s-1-x]=num;//printf("a[%d][%d]:%d\n",i+y-1-z,i+s-1-x,num);}//最左边的坐标是(i+y,i+s-1+x)}for(i=0;i<N;i++){for(s=0;s<N;s++){printf("%3d",a[i][s]);}printf("\n");}return 0;}*/int main(){int a[SIZE][SIZE]={0};int N;scanf("%d",&N);//每条边的下标在x,y上的增量int dx[]={0,1,0,-1};int dy[]={1,0,-1,0};int x=0,y=0,nx,ny,i,k=0; //k用来表示边,k=0,1,2,3  分别代表上,右,下,左for(i=0;i<N*N;i++){a[x][y]=i+1;nx=x+dx[k];  //下一个坐标的位置ny=y+dy[k];if(nx<0 || nx==N || ny<0 || ny==N || a[nx][ny]!=0) //下标越界或下标上已经赋值,转变方向{k=(k+1)%4;nx=x+dx[k];ny=y+dy[k];}x=nx;y=ny;}int j;for(i=0;i<N;i++){for(j=0;j<N;j++){printf("%3d",a[i][j]);}printf("\n");}return 0;}


0 0