用二维数组实现各矩阵输出
网上有许多关于回形矩阵(内旋,外旋),z型矩阵,s型矩阵等特殊矩阵的代码,每个人所敲出来代码也确实不一样。自己总结了一下,感觉还是比较简易的代码。
ps: 关于具体叫什么名字,看题目其实也不一样。用实例说明我做的是那一种吧。
回形内旋矩阵 回形外旋矩阵
ps:长宽不相等的情况同样适用。
Z型矩阵 斜线型
S型矩阵
代码部分
#include<stdio.h>
void huixingwai(void)//回形外旋矩阵
{
int a[20][20]={0};
int t,x,y;
int n,m;
printf("输入矩阵的长 宽:\n");
scanf("%d %d",&n,&m);
t=a[x=0][y=0]=n*m;
while(t>1)
{
while(y+1<m&&!a[x][y+1])//上
a[x][++y]=--t;
while(x+1<n&&!a[x+1][y])//右
a[++x][y]=--t;
while(y-1>=0&&!a[x][y-1])//下
a[x][--y]=--t;
while(x-1>=0&&!a[x-1][y])//左
a[--x][y]=--t;
}
for(x=0;x<n;x++)
{
for(y=0;y<m;y++)
printf("%3d",a[x][y]);
printf("\n");
}
return;
}
void huixingnei(void)//回形内旋矩阵
{
int a[20][20]={0};
int t,x,y;
int n,m;
t=a[x=0][y=0]=1;
printf("输入矩阵的长 宽:\n");
scanf("%d %d",&n,&m);
while(t<n*m)
{
while(y+1<m&&!a[x][y+1])//上
a[x][++y]=++t;
while(x+1<n&&!a[x+1][y])//右
a[++x][y]=++t;
while(y-1>=0&&!a[x][y-1])//下
a[x][--y]=++t;
while(x-1>=0&&!a[x-1][y])//左
a[--x][y]=++t;
}
for(x=0;x<n;x++)
{
for(y=0;y<m;y++)
printf("%3d",a[x][y]);
printf("\n");
}
return;
}
void zxing(void)//Z型矩阵
{
int a[20][20];
int n,m=1,t,x,y,flag=0;
printf("输入三角形边长\n");
scanf("%d",&n);
t=0;
x=0,y=-1;
while(t<n*(n+1)/2)
{
if(x==0)
{
flag=1;
a[x=0][++y]=++t;
}
if(y==0)
{
flag=0;
a[++x][y=0]=++t;
}
if(flag==0)
a[--x][++y]=++t;
else
a[++x][--y]=++t;
}
for(x=0;x<n;x++)
{
for(y=0;y<n-x;y++)
{
printf("%3d ",a[x][y]);
}
printf("\n");
}
return;
}
void xiexianxing(void)//斜线型
{
int s[20][20];
int i,j,n,m,k=1;
printf("输入三角形边长\n");
scanf("%d",&n);
for(m=0;m<n;m++)
for(i=m;i>=0;i--)
{
j=m-i;
s[i][j]=k;
k++;
}
for(i=0;i<n;i++)
{
for(j=0;j<n-i;j++)
{
printf("%d ",s[i][j]);
}
printf("\n");
}
return;
}
void sxing(void)//S型矩阵
{
int a[20][20]={0};
int t,x,y;
int n,m;
t=a[x=0][y=0]=1;
printf("输入矩阵的长 宽:\n");
scanf("%d %d",&n,&m);
while(t<n*m)
{
while(y+1<m) a[x][++y]=++t;
x++;
while(y>=0) a[x][y--]=++t;
x++;
}
for(x=0;x<n;x++)
{
for(y=0;y<m;y++)
printf("%3d",a[x][y]);
printf("\n");
}
return;
}
int main()
{
int n;
printf("输出1.回形外旋 2.回形内旋 3.z型 4.斜线型 5.s型\n");
scanf("%d",&n);
switch(n)
{
case 1: huixingwai();break;
case 2: huixingnei();break;
case 3: zxing();break;
case 4: xiexianxing();break;
case 5: sxing();break;
}
}