#J0079. 【深基5.习6】蛇形方阵

【深基5.习6】蛇形方阵

题目描述

给出一个不大于 99 的正整数 nn,输出 n×nn\times n 的蛇形方阵。

从左上角填上 11 开始,顺时针方向依次填入数字,如同样例所示。注意每个数字有都会占用 33 个字符,前面使用空格补齐。

输入格式

输入一个正整数 nn,含义如题所述。

输出格式

输出符合题目要求的蛇形矩阵。

4
1  2  3  4
 12 13 14  5
 11 16 15  6
 10  9  8  7

提示

数据保证,1n91 \leq n \leq 9

做法解析

  • 罗列 1nn1\sim n*n 的所有数字,然后将每一个数字填到合适的位置即可。
  • 初始的位置 x,yx,y 均为 11,同时我们需要一个控制方向的变量,并且不断地更新迭代。
  • 方向为 00 代表向右,11 代表向下, 22 代表向左,33 代表向上。

每一次需要更换方向满足以下任意两个条件即可。

  • 下一个位置没有超出了边界
  • 下一个位置已经有数字了。

本题的 33 个占位符可以使用 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;