NOIP2014普及组–螺旋矩阵
这道题一看貌似就是原来做过的一道叫蛇形矩阵(http://219.153.61.2:9000/problem/55) 的题,可是显然不是,那道题是需要保存的,因为需要打印整个二位数组,但是这道题是输出给定位置的值,而且
要是把整个矩阵打出来一耗时间而耗空间,而且可能拿五十分都做不到,所以就要观察原图,找寻规律;
我们可以把整个矩阵分作几个不同部分,一个部分就是一个圈,因为每个圈的边长也易求,起点值易求,所以只需找到所需点坐标在哪个圈的距起点何处即可;
#include<bits/stdc++.h>
using namespace std;
long long n,mx,my,idx,tot;
long long se[31000][3];
long long e;
int main() {
// freopen("matrix.in","r",stdin);
// freopen("matrix.out","w",stdout);
cin>>n>>mx>>my;
e=n*n;
for(int i=1; 1; i++) {
if(i&1)
se[++idx][0]=se[idx-1][0]+1;
else se[++idx][0]=se[idx-1][0]+(n-idx+1)*4-1;
if(se[idx][0]==e) break;
}
for(int i=1; i<=idx; i++) {
if(i&1) {
se[i][1]=n-i+1;
} else se[i][1]=se[i-1][1];
}
for(int i=1; i<=idx; i++) {
if(i&1) {
tot++;
se[i][2]=tot;
}
}
int c=min(mx,n-mx+1);
int d=min(my,n-my+1);
for(int i=1; i<=idx; i++) {
if(se[i][2]) {
if(c==se[i][2]&&d>=se[i][2]&&d<=se[i][2]+se[i][1]-1||d==se[i][2]&&c>=se[i][2]&&c<=se[i][2]+se[i][1]-1) {
if(mx==se[i][2]&&my==se[i][2]){
cout<<se[i][0];
return 0;
}
if(mx==se[i][2]) {
cout<<se[i][0]+my-se[i][2];
return 0;
}
if(n-mx+1==se[i][2]) {
cout<<se[i][0]+3*(se[i][1]-1)-my+se[i][2];
return 0;
}
if(my==se[i][2]) {
cout<<se[i][0]+4*(se[i][1]-1)-mx+se[i][2];
return 0;
}
if(n-my+1==se[i][2]){
cout<<se[i][0]+(se[i][1]-1)+mx-se[i][2];
return 0;
}
}
}
}
}\\因为可能要重复输出所以要提前return;