一、今天说的是哪种蛇形矩阵
蛇形矩阵有多种,今天说的是下面这种回形的蛇形矩阵。
如4x4的回形蛇形矩阵
如5x5的回形蛇形矩阵
通过分析发现,这种矩阵,在走一圈以后又变成一个小2个的矩阵,如5x5的矩阵,从1、2、3。。。到14、15、16一圈后,变成了3x3的矩阵,因此可以使用递归的方式来解决这个问题。
二、蛇形矩阵的递归实现
1.走一圈需要4个循环
1)分别是向下走n次(nxn的矩阵)
2)向左走n-1次
3)向上走n-1次
4)向右走n-2次
2.如果n是奇数,如7,递归时分别是7-2=5,5-2=3,3-2=1,然后结束
如果n是偶数,如8,递归时分别是8-2=6,6-2=4,4-2=2,然后结束
因此分别需要写出n=2、n=1时矩阵的输出方法
3.通过以上分析,写出以下蛇形矩阵的函数
//s:蛇形矩阵,start:矩阵开始值,n:nxn的蛇形矩阵,posi:开始的行号,posj:开始的列号
void Matrix(int **s,int start,int n,int posi,int posj)
{
int i;//n=1,最简单
if(n==1) {s[posi][posj]=start;return;}
else if(n==2) //n=2时,有4个元素
{
s[posi][posj]=start;
posi++;
s[posi][posj]=start+1;
posj--;
s[posi][posj]=start+2;
posi--;
s[posi][posj]=start+3;
}
else
{
for(i=0;i
{
s[posi][posj]=start;
start++;
posi++;
}
posi--;posj--; //注意,每个方向走了后行、列位置的细微变化
for(i=0;i
{
s[posi][posj]=start;
start++;
posj--;
}
posj++;posi--;
for(i=0;i
{
s[posi][posj]=start;
start++;
posi--;
}
posi++;posj++;
for(i=0;i
{
s[posi][posj]=start;
start++;
posj++;
}
posj--;posi++;
Matrix(s,start,n-2,posi,posj); //递归调用n-2的情形
}
}
三、蛇形矩阵函数的调用
int main()
{
printf("请输入nxn蛇形矩阵的数目n:\n");
int i,j,n;
int **s;
scanf("%d",&n);
s=(int **)malloc(n*sizeof(int *));
for(i=0;i
s[i]=(int *)malloc(n*sizeof(int));
Matrix(s,1,n,0,n-1);
for(i=0;i
{
for(j=0;j
printf("%4d ",s[i][j]);
printf("\n\n");
}
return 0;
} 一个int哦,不知道怎么跑出2个int了