Ctrl AC!一起 AC!
题目:忘题戳这
资料:螺旋矩阵算法研究
资料总结:
矩阵从0行0列开始,将矩阵分层,第一层命名为第零层。矩阵的边长为N,i表示第i层,
x[i],y[i]为第i个坐标。
规律一:矩阵的层数为(N+1)/ 2;
规律二:每层的左上角的值最小,其值为2 * i * (2 * N - 2 * i) + 1
规律三:某点x,y所在的层数NOceng为:min(min(x[i], y[i]), min(N - x[i] - 1, N - y[i] - 1))
规律四:
if (x[i] <= y[i]) 其对应的值为: t[NOceng] + (x[i]) + (y[i]) - 2 * NOceng ;
else 其对应的值为: t[NOceng + 1] - (x[i]) - (y[i]) + 2 * NOceng ;
不想背规律或推不来规律的可参考博主另一篇博客:
AC代码:
#include<iostream>
using namespace std;
int t[5005];//用一维数组记录每层左上角的值
int x[30], y[30];//坐标
int main() {
int K, N; cin >> K >> N;
int ceng = (N + 1) / 2;//层数
for (int i = 0; i < ceng; i++) {
t[i] = 2 * i * (2 * N - 2 * i) + 1;
}
for (int i = 0; i < K; i++) {
cin >> x[i] >> y[i];
x[i] -= 1; y[i] -= 1;//题目的矩阵和我们的矩阵开始位置不同
int NOceng = min(min(x[i], y[i]), min(N - x[i] - 1, N - y[i] - 1));//该点所在层数
if (x[i] <= y[i]) cout << t[NOceng] + (x[i]) + (y[i]) - 2 * NOceng << endl;
else cout << t[NOceng + 1] - (x[i]) - (y[i]) + 2 * NOceng << endl;
}
return 0;
}
感谢阅读!!!
Ctrl AC!一起 AC!