#J0079. 【深基5.习6】蛇形方阵
【深基5.习6】蛇形方阵
题目描述
给出一个不大于 的正整数 ,输出 的蛇形方阵。
从左上角填上 开始,顺时针方向依次填入数字,如同样例所示。注意每个数字有都会占用 个字符,前面使用空格补齐。
输入格式
输入一个正整数 ,含义如题所述。
输出格式
输出符合题目要求的蛇形矩阵。
4
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
提示
数据保证,。
做法解析
- 罗列 的所有数字,然后将每一个数字填到合适的位置即可。
- 初始的位置 均为 ,同时我们需要一个控制方向的变量,并且不断地更新迭代。
- 方向为 代表向右, 代表向下, 代表向左, 代表向上。
每一次需要更换方向满足以下任意两个条件即可。
- 下一个位置没有超出了边界
- 下一个位置已经有数字了。
本题的 个占位符可以使用 setw(3)
来完成。
int fx = 0; // 0代表右,1代表下,2代表左,3代表上
int x = 1, y = 1; // 实时更新填数的位置
for (int i = 1; i <= n * n; i++)
{
a[x][y] = i;
if (fx == 0) // 下一次向右走
{
// 向右走,会让y+1,若y+1大于n说明超出边界,或者下一个位置 a[x][y+1]已经填好了数字。
if (y + 1 > n || a[x][y + 1]) // 需要修改方向
fx = 1; // 向右变成向下
}
else if (fx == 1) // 下一次向下走
{ // 向下走,会让x+1,若x+1大于n说明超出边界,或者下一个位置 a[x+1][y]已经填好了数字。
if (x + 1 > n || a[x + 1][y]) // 需要修改方向
fx = 2; // 向下变成向左
}
else if (fx == 2) // 下一次向左走
{ // 向左走,会让y-1,若y-1小于1说明超出边界,或者下一个位置 a[x][y-1]已经填好了数字。
if (y - 1 < 1 || a[x][y - 1]) // 需要修改方向
fx = 3; // 向左变成向上
}
else // 下一次向上走
{
if (x - 1 < 1 || a[x - 1][y]) // 需要修改方向
fx = 0;
}
if (fx == 0)
y++; // 如果方向为右,那么y+1
if (fx == 1)
x++; // 如果方向为下,那么x+1
if (fx == 2)
y--; // 如果方向为左,那么y-1
if (fx == 3)
x--; // 如果方向为上,那么x-1
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
cout << setw(3) << a[i][j];
}
cout << endl;