Gym - 100947G Square Spiral Sear
2017-02-14 本文已影响0人
Cyril1317
题目大意
科学家目前正在开发一种称为“方形螺旋搜索”的算法。该算法按以下顺序搜索存储器位置(也在图中示出):
斜线右上方的取第二圈最大值点16(-2, 2) ,第一圈最大值点4(-1,1 )
斜线左下方的取第二圈最大值点24(2,-2),第一圈最大值点8(-1,1)
属于右上分块同一圈的其余点的步数就等于,该圈最大步数减去所求点(x1, y1)到最大步数点的距离。
然后两个分块的处理上有些细节
输入分析
3
1 0//此点属于右下-第一圈,步数最大值点4(-1,1),△x = |(-1)-1|=2,△y=|1-0|=1,此点步数=4-△x-△y=1
1 1
-2 1//此点属于左下-第二圈,步数最大值点24(2, -2),△x= |(-2)-2|=4,△y=|-2-1|=3,此点步数=24-△x-△y=17
代码分析
#include <stdio.h>
#include <stdlib.h>
int main()
{
int t;
long long x, y, st, xx, yy, res;
scanf("%d", &t);
while(t--)
{
scanf("%lld%lld", &x, &y);
xx = abs(0-x);
yy = abs(0-y);
st = max(xx, yy); //选出x,y中大的数字确认该点位于第st圈
if (x + y == 0) //该点在线上
{
if (x >= 0) res = (2*st+1)*(2*st+1)-1;//属于左下段
else res = (2*st)*(st*2);//属于右上段
}
else if (x+y > 0) //该点位于斜线右上方
{
res = (2*st)*(st*2);//该圈中步数的最大值
res = res - abs(x+st) - abs(st-y); //求出该点位置
}
else
{
res = (2*st+1)*(2*st+1)-1;
res = res - abs(x-st) - abs(st+y);
}
printf("%lld\n", res);
}
return 0;
}
ps
这题数据范围
- 1, 000, 000, 000 ≤ X ≤ 1, 000, 000, 000
- 1, 000, 000, 000 ≤ Y ≤ 1, 000, 000, 000
不能用int 要用long long