所谓“螺旋方阵”,是指对任意给定的N,将1到N×N的数字从左上角第1个格子开始,按顺时针螺旋方向顺序填入N×N的方阵里。本题要求构造这样的螺旋方阵。
输入格式:
输入在一行中给出一个正整数N(<10)。
输出格式:
输出N×N的螺旋方阵。每行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>
#include<math.h>
#include<stdlib.h>
#include<string.h>
int main()
{
int n, a[15][15];
memset(a, 0, sizeof(a));
scanf("%d", &n);
int i = 1, j = 1, k = 1;
while(k <= n * n)
{
while(j <= n)
{
if(!a[i][j])
a[i][j++] = k++;
else
break;
}
j--;
i++;
while(i <= n)
{
if(!a[i][j])
a[i++][j] = k++;
else
break;
}
i--;
j--;
while(j > 0)
{
if(!a[i][j])
a[i][j--] = k++;
else
break;
}
j++;
i--;
while(i > 0)
{
if(!a[i][j])
a[i--][j] = k++;
else
break;
}
i++;
j++;
}
for(i = 1; i <= n; i++)
{
for(j = 1; j < n; j++)
printf("%3d", a[i][j]);
printf("%3d\n", a[i][j]);
}
return 0;
}
代码二:
#include <stdio.h>
main()
{
int c=1,x=0, y=0,n, a[10][10]={0};
scanf("%d", &n);
a[x][y] = 1;
while(n*n!=c)
{
while(y+1<n && !a[x][y+1] )
a[x][++y] = ++c;
while(x+1<n && !a[x+1][y])
a[++x][y] = ++c;
while(y-1>=0 && !a[x][y-1])
a[x][--y] = ++c;
while(x-1>=0 && !a[x-1][y])
a[--x][y] = ++c;
}
for(x=0;x<n;x++)
{
for(y=0;y<n;y++)
{
printf("%3d", a[x][y]);
}
printf("\n");
}
}
代码三:
#include<stdio.h>
int main(){
int a,b,c,d,e,f,g,h;
scanf("%d",&a);
int x[a+2][a+2];
for(b=0;b<a+2;b++){
for(c=0;c<a+2;c++)x[b][c]=1;
}
for(b=1;b<a+1;b++){
for(c=1;c<a+1;c++)x[b][c]=0;
}
for(d=2,e=1,b=1,c=1,x[b][c]=1;d<=a*a;d++){
switch(e%4){
case 1:if(x[b][c+1]==0){
c++;
x[b][c]=d;
}else{
e++;
d--;
}break;
case 2:if(x[b+1][c]==0){
b++;
x[b][c]=d;
}else{
e++;
d--;
}break;
case 3:if(x[b][c-1]==0){
c--;
x[b][c]=d;
}else{
e++;
d--;
}break;
case 0:if(x[b-1][c]==0){
b--;
x[b][c]=d;
}else{
e++;
d--;
}break;
}
}
for(b=1;b<a+1;b++){
for(c=1;c<a+1;c++){
if(c!=a)printf("%3d",x[b][c]);
else printf("%3d\n",x[b][c]);
}
}
}
代码四:
#include<stdio.h>
int main()
{int n;
scanf("%d",&n);
int arr[n][n],i,j,k=1,c=n-1,x=0,y=0;
for(i=0;i<n/2;i++)
{for(j=0;j<c;j++) arr[x][y++] = k++;
for(j=0;j<c;j++) arr[x++][y] = k++;
for(j=0;j<c;j++) arr[x][y--] = k++;
for(j=0;j<c;j++) arr[x--][y] = k++;
x++;y++;c-=2;
}
if(n%2) arr[n/2][n/2] = k;
for(i=0;i<n;i++)
{for(j=0;j<n;j++)
{ printf("%3d",arr[i][j]); }
printf("\n");}}
代码五:
#include<stdio.h>
int main(){
int n;
scanf("%d",&n);
int a[10][10];
int num = 1;
int layer;
int up,down,left,right;
for(layer=0; layer<n/2+1; layer++){
for(right=0; right<n-2*layer-1; right++,num++){
a[layer][layer+right] = num;
}
for(down=0; down<n-2*layer-1; down++,num++){
a[layer+down][right+layer] = num;
}
for(left=0; left<n-2*layer-1; left++,num++){
a[layer+down][right+layer-left] = num;
}
for(up=0; up<n-2*layer-1; up++,num++){
a[layer+down-up][right+layer-left] = num;
}
}
if(n%2 != 0)
a[n/2][n/2] = n*n;
int i,j;
for(i=0;i<n;i++){
for(j=0;j<n;j++){
printf("%3d",a[i][j]);
}
printf("\n");
}
return 0;
}