思路
只能从边界通过,看上去有千万种走法(确实如此),但题目的要求是路程就行,这样我们就可以将路径暂时忽略。
我们类推一下正方形,让他也只能从边界通过。假如我们要从左上角到右下角,不管中间怎么走,最短的距离,我们都可以映射到边上,从第
n
列到第
再回到三角形这里,类似的我们给他也类似地进行划分,不过这次我们有 3 条假想路径。
具体实现时,先进行预处理,将每一层的首尾数字计算出来,这样便于确定两点的相对位置。
代码
#include <cstdio>
#include <cmath>
using namespace std;
int begin[65000];
int end[65000];
int find(int num)
{
for(int i=1; ;i++)
{
if(num<=end[i]) return i;
}
}
void init()
{
int cur = 1;
for(int i=1,j=1; ;i+=2, j++)
{
begin[j] = cur;
end[j] = (cur+=i)-1;
if(cur>1000000000) break;
}
}
int main()
{
init();
int a, b, ans;
while(scanf("%d%d", &a, &b)==2)
{
int l_a = find(a);
int l_b = find(b);
ans = abs(l_a-l_b) +
abs((a-begin[l_a])/2-(b-begin[l_b])/2) +
abs((end[l_a]-a)/2-(end[l_b]-b)/2);
printf("%d\n", ans);
}
return 0;
}