目录
环形矩阵
输入,一个n,一个m,代表行和列
输出,一个n行m列的从1开始到n*m结束的矩阵
#include<stdio.h>
int main()
{
int i,j,k,n,m,a;
int num[20][20]={0},l,h;
scanf("%d %d",&n,&m);//行 列
i=j=k=0;
a=1;//从1开始填充
h=n;
l=m;
while(a <= l*h)//当数据大于h*l时结束
{
for(j=k;j<m;j++)//行号 i 不变,列号j自加
{
if(num[i][j]==0)
num[i][j]=a;
a++;
}
j--;//j与a都多加了一次,这里减去
a--;
for(i=k;i<n;i++)//行++,列不变
{
if(num[i][j]==0)
num[i][j]=a;
a++;
}
i--;//j与a都多加了一次,这里减去
a--;
for(j=m-1;j>k;j--)//列-- 行不变
{
if(num[i][j]==0)
num[i][j]=a;
a++;
}
for(i=n-1;i>k;i--)//行-- 列不变
{
if(num[i][j]==0)
num[i][j]=a;
a++;
}
i++;//i多减了一次;
n--;//下,右边界减一,圈数加一,缩小范围
m--;
k++;
}
for(i=0;i<h;i++)//打印出已经填充好的数据
{
for(j=0;j<l;j++)
printf("%-3d ",num[i][j]);
printf("\n");
}
return 0;
}
蛇形矩阵
输入一个n;
输出一个n阶的蛇形矩阵
#include<stdio.h>
int main()
{
int i,j,k,n,a=1; //行
int data [100][100];
i=j=k=0; //k:运动方向
data[0][0] = 1;
printf("Input n:\n");
scanf("%d",&n);
while( data[i][j]!=n*n)//最后一个为n*n时结束
{
switch(k)
{
case 0://向右列++
{
data[i][++j] = ++a;
k=(i == n-1)?3:1; //到最后一行右上否则左下
break;
}
case 1://向左下 行++,列--
{
data[++i][--j] = ++a;
if(i==n-1) k = 0; //到最后一行向右 或者 到第一列向下,否则继续
else if(j == 0 ) k = 2;
break;
}
case 2://向下 行++
{
data[++i][j] =++a;
k=(j == n-1)?1:3;//到最后一列向左下否则右上
break;
}
case 3://右上行--,列++
{
data[--i][++j] = ++a;
if(j == n-1) k = 2; //到最后一列向下 或者 到第一行向右,否则 继续
else if( i == 0) k = 0;
break;
}
}
}
for(i=0;i<n;i++)//打印矩阵
{
for(j=0;j<n;j++)
printf("%-4d",data[i][j]);
printf("\n");
}
}