← 返回题目页

A0759 [2014J3]螺旋矩阵

标程

#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    long long n, i, j;
    cin >> n >> i >> j;

    // 圈数:格子 (i,j) 离矩阵边界有多远
    long long k = min(min(i - 1, j - 1), min(n - i, n - j));
    // 这一圈的边长
    long long m = n - 2 * k;
    // 这一圈的第一个数(前面的圈一共填了 n^2 - m^2 个格子)
    long long base = n * n - m * m + 1;
    // 圈内本地坐标(1 起)
    long long x = j - k, y = i - k;

    long long offset;
    if (y == 1) {
        offset = x - 1;          // 上边:从左往右
    } else if (x == m) {
        offset = m + y - 2;      // 右边:从上往下
    } else if (y == m) {
        offset = 3 * m - x - 2;  // 下边:从右往左
    } else {
        offset = 4 * m - y - 3;  // 左边:从下往上
    }

    cout << base + offset << '\n';
    return 0;
}

动画演示