一.题目:
描述:给你一个整数n,输出n∗n的蛇形矩阵。
输入描述:输入一行,包含一个整数n
输出描述:输出n行,每行包含n个正整数,通过空格分隔。
(1<=n<=1000)
示例:
输入:4
输出:1 2 6 7
3 5 8 13
4 9 12 14
10 11 15 16
二.题目剖析:
(1)明确蛇形矩阵的构成:
由上图,我们可以发现矩阵的走向只为两种:
1.从右向左(下)
2.从左到右(上)
(2)逻辑推理:
所以,我用pos变量表示方向,其中1代表右上与右,-1代表左下与下.
用i
代表行-------------j
代表列
运动情况分为6种:
- 碰到上边界(即i等于1 且 j小于n): 列增加1,行不变--------往右移动一格
- 碰到左边界(即j等于1 且 i小于n): 行增加1,列不变--------往下移动一格
- 碰到右边界(即j等于n): 行增加1,列不变--------往下移动一格
- 碰到下边界(即i等于n): 列增加1,行不变--------往右移动一格
以上四种是在边界上面移动.只有向右 和 向下
5.除去上面四种的边界情况,就是在边界中间的左下移动
6.除去上面四种的边界情况,就是在边界中间的右上移动
最后两种是在边界内移动 只有右上和左下 。
三.转换代码:
#include <stdio.h>
int array[1001][1001] = { 0 };
int main()
{
int n = 0;
scanf("%d",&n);
int i = 1, j = 1, k = 0,pos = 1; //pos代表方向移动 1代表右上 -1代表左下
array[i][j] = 1;
for (k = 2; k <= n*n; k++)
{
if (i == 1 && j <n && pos ==1) //碰到上边界,列增加1,行不变 此后行增,列减
{
array[i][++j] = k;
pos = -1; //方向注意
}
else if(j==1 && i<n && pos == -1)//碰到左边界,行增加1,列不变 此后行减,列增
{
array[++i][j] = k;
pos = 1; //方向注意
}
else if (j == n && pos==1) //碰到左边界,行增加1,列不变 此后行增,列减
{
array[++i][j] = k;
pos = -1; //方向注意
}
else if (i == n && pos ==-1) //碰到右边界,列增加1,行不变 此后行减,列增
{
array[i][++j] = k;
pos = 1;
}
else if (pos == 1) //除去上面的边界情况,就是中间移动过程
{
array[--i][++j] = k;
}
else if(pos == -1)
{
array[++i][--j] = k;
}
}
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
printf("%d ",array[i][j]);
printf("\n");
}
return 0;
}