题解 | #蛇形矩阵#
蛇形矩阵
https://www.nowcoder.com/practice/f228a074c5274619b26be544962375e1
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define row 50
#define col 50
//蛇形矩阵的移动方式有六种 分别为四种边界情况(左边界,右边界,上边界,下边界) 还有两种对角线移动的情况
//我们需要将上述六种移动情况分开处理
//相比于回形矩阵,蛇形矩阵的边界条件是不会发生改变的
//因此我们采用一次循环只赋值一个元素的方式,通过if语句来判断移动方式
//同时注意边界移动决定了对角线移动的方向(比如移动到上边界时,右移一位后会向左下方移动)
//而且两种对角线移动方式的边界条件无法被区分
//因此我们需要引入一个变量来对 对角线移动方向进行标记(1和-1分别表示一种移动方向)
//另外四种边界情况可以决定对角线的移动方向
static void Prinboard(int arr[row][col], int n)
{
int i = 0;
for (i = 0; i < n; i++)
{
int j = 0;
for (j = 0; j < n; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
int main()
{
int arr[row][col] = { 0 };
int n = 0;
scanf("%d", &n);
int i = n * n; /*循环限定变量*/
int count = 1;
int x = 0;
int y = 0; /*相比于回形矩阵蛇形矩阵需要两个数组访问下标来对数组进行赋值*/
int Direct = 1; /*方向标记变量1表示对角线右上移动,-1表示对角线左下移动*/
while (i)
{
if (0 == x && y != n - 1 && 1 == Direct) /*上边界移动限制条件(对角线向右上方移动可达到 上边界)*/
{ /*判断部分的方向变量可以避免上下左右边界移动连 续进行多次的情况发生*/
arr[x][y++] = count++;
Direct = -1; /*上边界移动完后对角线移动方向变为-1(向左下移 动)*/
i--;
}
else if (x != n - 1 && 0 == y && -1 == Direct) /*左边界移动限制条件(对角线左下移动可以达到左 边界)*/
{
arr[x++][y] = count++;
Direct = 1; /* 左边界移动完后对角线移动方向变为右上方*/
i--;
}
else if (x != n - 1 && y == n - 1 && 1 == Direct)/*右边界移动限制条件(对角线向右上方移动达到右 边界)*/
{
arr[x++][y] = count++;
Direct = -1; /*右边界移动完后对角线移动方向改为左下方*/
i--;
}
else if (x == n - 1 && y != n - 1 && -1 == Direct)/*下边界移动限制条件(对角线左下方移动达到下对角线)*/
{
arr[x][y++] = count++;
Direct = 1; /*下边界移动完后对角线移动方向改为右上方*/
i--;
}
else if (1 == Direct) /*对角线右上方移动*/
{
arr[x--][y++] = count++;
i--;
}
else if (-1 == Direct) /*对角线左下方移动*/
{
arr[x++][y--] = count++;
i--;
}
}
Prinboard(arr, n);
return 0;
}
曼迪匹艾公司福利 145人发布