这题怎么做啊?求C++代码

螺旋矩阵 3

【题目背景】

一个 n 行 n 列的螺旋矩阵可由如图所示的方法生成,观察图片,找出填数规律。填 数规则为从 1 开始填到 n×n。

1 2 6 7 15 16 28 29

3 5 8 14 17 27 30 43

4 9 13 18 26 31 42 44

10 12 19 25 32 41 45 54

11 20 24 33 40 46 53 55

21 23 34 39 47 52 56 61

22 35 38 48 51 57 60 62

36 37 49 50 58 59 63 64

现在给出矩阵大小 n 以及 i 和 j,请你求出该矩阵中第 i 行第 j 列的数是多少。

【输入格式】

从标准输入读入数据。 共一行,包含三个整数 n(1≤n≤1,000)、i(1≤i≤n)、j(1≤ j≤n),每两个整 数之间用一个空格隔开,分别表示矩阵大小、待求的数所在的行号和列号。

【输出格式】

输出到标准输出。 一个整数,表示相应矩阵中第 i 行第 j 列的数。

【样例 1 输入】

8 2 8

【样例 1 输出】

43

【子任务】

• 对于 30% 的测试数据,n≤10;

• 对于 60% 的测试数据,n≤100;

• 对于 100% 的测试数据,n≤1,000;

• 特别地,对于 20% 的测试数据,i = j = 1。

求C++代码,在线等

另外,我用人格担保,回答了正确了肯定是要采纳的

各位大佬求救救

#include <iostream>
using namespace std;

int main()
{
    int n, ii, jj;
    cin >> n >> ii >> jj;
    ii--;
    jj--;
    int *p = new int[n * n];
    int d = 0;
    int i = 0;
    int j = 0;
    for (int x = 1; x <= n * n; x++)
    {
        if (i == ii && j == jj) { cout << x; break; }
        p[i * n + j] = x;
        if (d == 0 && (i == 0 && j != n - 1))
        {
            j = j + 1;
            d = 1;
        }
        else if (d == 0 && j == n - 1)
        {
            i = i + 1;
            d = 1;
        }
        else if (d == 1 && (j == 0 && i != n - 1))
        {
            i = i + 1;
            d = 0;
        }
        else if (d == 1 && i == n - 1)
        {
            j = j + 1;
            d = 0;
        }
        else if (d == 0)
        {
            i--;
            j++;
        }
        else
        {
            i++;
            j--;
        }
    }
    //for (int i = 0; i < n; i++)
    //{
    //  for (int j = 0; j < n; j++)
    //  {
    //      cout << p[i * n + j] << " ";
    //  }
    //  cout << endl;
    //}
    return 0;
}