#include<stdio.h>
#include<stdlib.h>
int **a,n,m=1;
void Initarry()
{
int i,j;
a=(int **)malloc((n+1)*sizeof(int*));
for(i=0;i<=n;i++)
a[i]=(int *)malloc((n+1)*sizeof(int));
for(i=0;i<n;i++)
for(j=0;j<=n;j++)
a[i][j]=0;
}
void print()
{
int i,j;
for(i=0;i<n;i++){
for(j=0;j<n;j++)
printf("%-4d",a[i][j]);
if(j==n)
printf(" ");
}
}
void draw(int x)
{
int i,j;
for(j=x;j<n-x;j++,m++){
a[x][j]=m;
}
for(i=x+1;i<n-x;i++,m++){
a[i][n-1-x]=m;
}
for(j=n-2-x;j>=x;j--,m++){
a[n-1-x][j]=m;
}
for(i=n-2-x;i>x;i--,m++){
a[i][x]=m;
}
}
int main()
{
int x=0;
scanf("%d",&n);
Initarry();//初始化数组
print();
while(m<=n*n){
draw(x);//从对角线(0,0)(1,1)(2,2).....开始赋值
x++;
}
print();
return 0;
}
#include<stdlib.h>
int **a,n,m=1;
void Initarry()
{
int i,j;
a=(int **)malloc((n+1)*sizeof(int*));
for(i=0;i<=n;i++)
a[i]=(int *)malloc((n+1)*sizeof(int));
for(i=0;i<n;i++)
for(j=0;j<=n;j++)
a[i][j]=0;
}
void print()
{
int i,j;
for(i=0;i<n;i++){
for(j=0;j<n;j++)
printf("%-4d",a[i][j]);
if(j==n)
printf(" ");
}
}
void draw(int x)
{
int i,j;
for(j=x;j<n-x;j++,m++){
a[x][j]=m;
}
for(i=x+1;i<n-x;i++,m++){
a[i][n-1-x]=m;
}
for(j=n-2-x;j>=x;j--,m++){
a[n-1-x][j]=m;
}
for(i=n-2-x;i>x;i--,m++){
a[i][x]=m;
}
}
int main()
{
int x=0;
scanf("%d",&n);
Initarry();//初始化数组
print();
while(m<=n*n){
draw(x);//从对角线(0,0)(1,1)(2,2).....开始赋值
x++;
}
print();
return 0;
}
昨天在论坛上看到的一个贴:
8. 输入一个正整数n,打印如下n*n的方阵。
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
n=5时
1 2 3 4 5 6
20 21 22 23 24 7
19 32 33 34 25 8
18 31 36 35 26 9
17 30 29 28 27 10
16 15 14 13 12 11
n=6时
感觉挺好玩的,貌似难度也不大
一开始的想法是看看有没有规律,结果看了N久没看出来,哎,数学太烂啊
于是就只能用最笨的办法,一个一个的打印了
不过在这过程中复习了下2维数组空间的申请,嘿嘿
a=(int **)malloc((n+1)*sizeof(int*));
for(i=0;i<=n;i++)
a[i]=(int *)malloc((n+1)*sizeof(int));
for(i=0;i<=n;i++)
a[i]=(int *)malloc((n+1)*sizeof(int));
全代码如下: