1 条题解

  • 0
    @ 2077-12-7 22:11:37

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

    解题思路

    从左上角开始按右、下、左、上四个方向填数。若下一格越界或已经填过,就顺时针换方向。

    正确性说明

    从当前方向尽量延伸,到边界后转弯会沿外圈再逐层进入内圈,恰好形成顺时针螺旋。每次填入一个未填格,共 n² 次覆盖全部格子。

    易错点

    每个数占三列,用 setw(3),不要在数后额外加空格。

    复杂度

    时间 O(n²),空间 O(n²)。

    参考代码(C++11)

    #include <bits/stdc++.h>
    using namespace std;
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        int n;
        cin >> n;
        vector<vector<int>> a(n, vector<int>(n));
        int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0}, x = 0, y = 0, d = 0;
        for (int k = 1; k <= n * n; k++) {
            a[x][y] = k;
            int nx = x + dx[d], ny = y + dy[d];
            if (nx < 0 || nx >= n || ny < 0 || ny >= n || a[nx][ny]) {
                d = (d + 1) % 4;
                nx = x + dx[d];
                ny = y + dy[d];
            }
            x = nx;
            y = ny;
        }
        for (auto &r : a) {
            for (int v : r)
                cout << setw(3) << v;
            cout << "\n";
        }
        return 0;
    }
    
    • 1

    信息

    ID
    93
    时间
    1000ms
    内存
    125MiB
    难度
    进阶
    标签
    递交数
    2
    已通过
    1
    上传者