2018年蓝桥杯省赛第七题(c++组)
第七题
标题:螺旋折线
如图所示的螺旋折线经过平面上所有整点恰好一次。
对于整点(X, Y),我们定义它到原点的距离dis(X, Y)是从原点到(X, Y)的螺旋折线段的长度。
例如dis(0, 1)=3, dis(-2, -1)=9
给出整点坐标(X, Y),你能计算出dis(X, Y)吗?
思路:这题相对比较简单,每拐弯两次就增加一次长度,然后通过一个名为vertical的布尔值来判断此时是竖直走或是横着走。当横坐标与所给值相等时,将纵坐标之差的绝对值加给dis即可,反之亦然。
#include<iostream>
#include<cmath>
using namespace std;
int main(void)
{
int count = 1;
long int a, b,curX=0,curY=0,dis=0,num=1,count2=0;
bool minus = true,vertical=false;
cin >> a >> b;
while (curX != a || curY != b)
{
if (minus == true)
{
if (vertical == false)
{
curX -= num;
dis += num;
vertical = true;
if (curX == a)
{
dis += abs(curY-b);
break;
}
}
else
{
curY -= num;
dis += num;
vertical = false;
if (curY == b)
{
dis += abs(curX - a);
break;
}
}
count++;
count2++;
if (count == 2)
{
count = 0;
minus = false;
}
if (count2 == 2) {
count2 = 0;
num++;
}
}
else
{
if (vertical == false)
{
curX += num;
dis += num;
vertical = true;
if (curX == a)
{
dis += abs(curY - b);
break;
}
}
else
{
curY += num;
dis += num;
vertical = false;
if (curY == b)
{
dis += abs(curX - a);
break;
}
}
count++; count2++;
if (count == 2)
{
count = 0;
minus = true;
}
if (count2 == 2)
{
count2 = 0;
num++;
}
}
}
cout << dis;
}