69,373
社区成员
发帖
与我相关
我的任务
分享
#include"stdio.h"
//打印蛇形矩阵
#define MAX 30
int print(int n,int a[MAX][MAX])//用递归的方法
{
int i,j,m;
if(n==1)return a[0][0]=1;
else if(n%2==0)//偶数阶的最外面的数是顺时针的方向
{
m=(n-1)*(n-1)+1;
for(i=0;i<n;i++)
a[i][n-1]=m++;
for(j=n-2;j>=0;j--)
a[n-1][j]=m++;
return print(n-1,a);
}
else//奇数阶的最外面是逆时针的方向
{
m=(n-1)*(n-1)+1;
for(j=0;j<n;j++)
a[n-1][j]=m++;
for(i=n-2;i>=0;i--)
a[i][n-1]=m++;
return print(n-1,a);
}
}
main()
{
int a[MAX][MAX],i,j,m=1,n;
printf("请输入矩阵的阶数n<50:");
scanf("%d",&n);
print(n,a);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
printf("%4d",a[i][j]);
m++;
if((m-1)%n==0)printf("\n");
}
}
#include<stdio.h>
#define MAX 25
int a[MAX][MAX]={0};
void snake_matrix(int n)
{
int i,j,k,m,r; //m为从1-n按顺序要存入数组的数,r是为了暂存数据用的
i=j=k=0; //i,j为控制数组a下标的,k:比如说k为偶数,则从a[k][0]开始把m存入,是奇数则从a[0][k]开始把m存入
for(k=0,m=1;k*k<n+1;k++)
{
if(k%2==0) //k为偶数
{
i=k;
j=0;
r=m;
while(m<=r+k&&m!=n+1) //从a[k][0]开始向右存入m
a[i][j++]=m++;
m--;
r=m;
j--;
while(m<=r+k&&m!=n+1) //从a[k][k]开始向上存入m
a[i--][j]=m++;
}
else
{
i=0;
j=k;
r=m;
while(m<=r+k&&m!=n+1) //从a[0][k]开始向下存入m
a[i++][j]=m++;
m--;
r=m;
i--;
while(m<=r+k&&m!=n+1) //从a[k][k]开始向左存入m
a[i][j--]=m++;
}
}
}
void print(int n) //打印输出
{
int i,j,k;
for(i=k=0;i<=MAX;i++)
{
for(j=0;j<=MAX;j++)
if(a[i][j]!=0) //如果是0不输出
printf("%-4d",a[i][j]);
else if((i+1)*(i+1)>n&&i*i<n) //如果最后一行前面有0,则用空格代替,比如输入98时,最后一行是0,0,99,98……
printf(" ");
else
break; //其它情况跳出循环
printf("\n");
if((i+1)*(i+1)>n) //如果最后一行输出完毕,就结束循环……
break;
}
}
void main()
{
int n;
printf("n:");
scanf("%d",&n); //输入蛇形矩阵的长度,为了正常显示,n应小于400
snake_matrix(n); //生成长度为n的蛇形矩阵
print(n); //输出生成蛇形矩阵
}
// 1 2 9 10 25
// 4 3 8 11 24
// 5 6 7 12 23
// 16 15 14 13 22
// 17 18 19 20 21