tengxun线上测评有一道题是回型矩阵的实现,这里总结一下回型与蛇形矩阵的实现。由于蛇形矩阵比较难,这里先介绍回型矩阵。
所谓回型矩阵,就是输出一个n阶行列式,行列式的特点是就是输入n,然后输出数字组成回型矩阵,例如输入n=4得到,以此类推。
回型矩阵实现
把行列式的每一行单独分离出来,可以用二维数组类比,a[x][y] 中x相当于行,y相当于列,于是往右时,只需要让y++,往下时,只需要让x++,往左时,只需要让y–,往上时,只需要让x–。每个方向用一个for循环,循环次数除最后一个为n-2外,其余都是n-1。每做完一层后进行递归,知道总数大于n^2。
废话不多说,直接上代码。
#include <stdio.h>
int a[10][10];//最多支持10阶的,要再多的这里可以改
int sum;
int layer(int x, int y, int n, int StartNum)
{
int i;
a[x][y] = StartNum++;
for(i = 0; i < n - 1; i++)
{
a[x][++y] = StartNum++;
}
for(i = 0; i < n - 1; i++)
{
a[++x][y] = StartNum++;
}
for(i = 0; i < n - 1; i++)
{
a[x][--y] = StartNum++;
}
for(i = 0; i < n - 2; i++)
{
a[--x][y] = StartNum++;
}
if(StartNum > sum)
{
return;
}
layer(x, ++y, n - 2, StartNum);
}
int main()
{
int n, i, j;
scanf("%d", &n);
sum = n * n;
layer(0, 0, n, 1);
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
printf("%d ", a[i][j]);
}
printf("\n");
}
return 0;
}
蛇形矩阵实现
蛇形比回型要难一些,因为坐标的移动比较复杂。思路和回型的比较类似,都是把行列式分成一行行的形式用二维数组模拟。用dx,dy来决定下一步x,y的走向。
有一点需要注意的是,再过了对角线后,x,y的走向不能再用是否小于0来决定。如果还用的话后面的+1还是+2就会有矛盾,所有用一个flag来判断是否过对角线。
具体代码如下:
#include <stdio.h>
#define MAX 10
int a[MAX][MAX];
int sum;
int layer(int y, int x, int i, int StartNum)
{
int flag = 0;
int dy = -1;
int dx = 1;
a[y][x] = StartNum++;
while(1)
{
x += dx;
y += dy;
if(StartNum > sum)
{
return;
}
if(y >= i)
{
flag = 1;
x = x + 2;
y = i - 1;
dx = 1;
dy = -1;
}
if(x >= i)
{
flag = 1;
y = y + 2;
x = i - 1;
dy = 1;
dx = -1;
}
if(y < 0 && !flag)
{
y = 0;
dx = -1;
dy = 1;
}
if(x < 0 && !flag)
{
x = 0;
dx = 1;
dy = -1;
}
a[y][x] = StartNum++;
}
}
int main()
{
int n, k, i, j;
scanf("%d", &n);
sum = n * n;
if(n > 9)
{
k = 4;
}
else
{
k = 3;
}
layer(0, 0, n, 1);
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
printf("%*d", k, a[i][j]);
}
printf("\n");
}
return 0;
}