已知,矩阵的运转是这样的,规律找不到的话,直接模拟就好了。o(n2)刚好跑满
再放张图,你一层一层的剥开我的心~~~
#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;
}