已知,矩阵的运转是这样的,规律找不到的话,直接模拟就好了。o(n2)刚好跑满 alt

再放张图,你一层一层的剥开我的心~~~ alt

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
int main() //删掉数组直接累加
{               // 从左往右 行是固定的 列号

    int n, x, y, cnt = 1;
    cin >> n >> x >> y;
    for (int i = 1; i <= (n + 1) / 2; i++)
    {
        for (int j = i; j <= (n - i + 1); j++)
             // 从左往右 行是固定的 列号
            {
                if (i == x && j == y)
                {
                    cout << cnt << endl;
                    return 0; //找打即返回
                }
                cnt++;
            }
        for (int j = i + 1; j <= (n - i + 1); j++) // 从上到下 列固定 枚举行号
        {
            if (j == x && n - i + 1 == y)
            {
                cout << cnt << endl;
                return 0;
            }
            cnt++;
        }
        for (int j = n - i; j > i; j--)
        //同上
            {
                if (n - i + 1 == x && j == y)
                {
                    cout << cnt << endl;
                    return 0;
                }
                cnt++;
            }
        for (int j = n - i + 1; j > i; j--)
        {
            if (j == x && i == y)
            {
                cout << cnt << endl;
                return 0;
            }
            cnt++;
        }
    }
    return 0;
}

觉得太暴力的话直接算也不是不行.

让我们把每一层看成一个独立的矩阵。

判断坐标(x , y)在哪一层上有两种情况:

①x 在该矩阵的第一行或最后一行;

②y 在矩阵的第一列或最后一列。

即:

当x在第1行时值=y

当y在第n列时值=n+(x-1)

当y在第1列时值=3n-3+(n-x+1)*

当x在第n行时值=n+(n-1)+(n-y)

外圈可以计算为4*(n-1)

还不明白的话,对照上面的图画一下推一推就好了。

#include <bits/stdc++.h>
using namespace std;
int dg(int x, int y, int n)
{
    if (x == 1)
        return y;
    else if (y == 1)
        return 3 * n - 3 + (n - x + 1);
    else if (x == n)
        return n + (n - 1) + (n - y);
    else if (y == n)
        return n + (x - 1);
    else
    {
        return dg(x - 1, y - 1, n - 2) + 4 * (n - 1);
    }
}
int main()
{
    int n;
    cin >> n;
    int x, y;
    cin >> x >> y;
    cout << dg(x, y, n);
    return 0;
}